如何使用php标头下载所有文件类型

时间:2017-10-13 01:07:09

标签: php header mime-types

我想制作一个强制下载文件,用于从服务器下载文件,并在数据库中保存网址,我也不想向客户显示下载链接,我知道可以隐藏链接htaccess但我想限制我的链接仅适用于为每个链接支付费用的客户。

我使用php header()函数来完成我的目标,但问题与我在脚本下面的mime类型有关,而我不想为每个url定义mime类型(基于文件类型和扩展名) )在数组或类似的东西,因为我的文件中有各种各样的文件类型,我想与我的用户共享这些文件,我不能单独为每种文件类型定义一个mime类型

我需要一个很好的函数来从文件名(自动)获取mime类型,如mime_content_type(),但它与php扩展相关,我无法访问我的共享中的php.ini主机以及此功能已弃用。

以下代码与mp3和zip文件等扩展程序兼容,但通过此脚本下载的mp4文件已损坏且无法在媒体播放器中播放

php code:

<?php
require 'includes/connection.php';
$connection=newconnection();
if(isset($_GET['fileid']) && is_numeric($_GET['fileid'])){
$file_id=input_security($_GET['fileid']);
$linkque=mysqli_query($connection,"SELECT * FROM download_segments WHERE ds_id='".$file_id."'");
$checkexist=mysqli_num_rows($linkque);
$f_row=mysqli_fetch_array($linkque);

if($checkexist==0){
    echo 'Invalid file id';
}else if($checkexist>=1 && $f_row['payment_model']=="free"){
    $path=$f_row['url'];
    $sep_parts = pathinfo($path);
    $file_name  = $sep_parts['basename'];
    $file_ext   = $sep_parts['extension'];
    if (file_exists($path)) {   

        $mimetypes = array(
        "avi" => "video/x-msvideo",
        "exe" => "application/octet-stream",
        "mp4" => "video/mp4",
        "zip" => "application/zip",
        "mp3" => "audio/mpeg",
        "mpg" => "video/mpeg"
        );
        $mimedefault = "video/mp4";

        $mtype=isset($mimetypes[$file_ext]) ? $mimetypes[$file_ext] : $mimedefault;
        header('Content-Description: File Transfer');
        header("Content-Type: " . $mtype);
    header('Content-Disposition: attachment; filename="'.basename($path).'"');
    //header('Content-Length: ' . filesize($path) );
    //header("Pragma: no-cache");
    //header('Expires: 0');
    //header('Cache-Control: must-revalidate');
    //header('Pragma: public');

    readfile($path);
    exit;
    }else{
    echo 'not exist';
    }
}
}
?>

0 个答案:

没有答案