android file transfer下载_PHP通过header方式下载文件

a6099926ccec2b2f04fdf9fa45a0a702.png

php中文网最新课程

每日17点准时技术干货分享

d542e9115f101fe741b10b35e8dfb888.png

4c2361f9980c3a4460bfefb736521e52.gif

本文为php中文网认证作者:“一朵云彩”投稿,欢迎加入php中文网有偿投稿计划!

PHP通过header方式下载文件时,不能使用ajax方式提交,该方式会将header结果返回给ajax。

(1) 在下载大文件的时候,通常需要很长的时间,PHP有默认执行时间,一般是30s,超过该时间,就是下载失败,所以需要设置一下超时时间`set_time_limit(0);`

该语句说明函数执行不设置超时时间。另一个需要设置的就是内存使用,设置`ini_set('memory_limit', '128M');`即可。

(2) 对于下载文件的文件名称,下载下来可能会出现乱码,当然,这种情况出现在文件名包含中文或者特殊字符的情况下,此时,可以设置一下header:

$contentDispositionField = 'Content-Disposition: attachment; '                    . sprintf('filename="%s"; ', basename($file))                    . sprintf("filename*=utf-8''%s", basename($file));header($contentDispositionField);

(3)下载buffer大小,这个可以根据服务器带宽设置,一般4096就可以

(4)下载时,可以在echo buffer之后设置sleep(1)让程序休眠

(5)在设置header之前,ob_clean()一下,清除缓存区内容

1.强制下载本地文件

function forceDownload($file = ''){    set_time_limit(0);     //超时设置    ini_set('memory_limit', '128M');    //内存大小设置    ob_clean();    header("Pragma: public");    header("Expires: 0");    header("Cache-Control: must-revalidate, post-check=0, pre-check=0");    header("Content-Type: application/force-download");    header("Content-Type: application/octet-stream");    header("Content-Type: application/download");    $contentDispositionField = 'Content-Disposition: attachment; '           . sprintf('filename="%s"; ', basename($file))        . sprintf("filename*=utf-8''%s", basename($file));    //处理文件名称    header($contentDispositionField);    header("Content-Transfer-Encoding: binary");    header("Content-Length: " . filesize($file));    $read_buffer = 4096;                                    //设置buffer大小    $handle = fopen($file, 'rb');    //总的缓冲的字节数    $sum_buffer = 0;    //只要没到文件尾,就一直读取    while (!feof($handle) && $sum_buffer < filesize($file)) {        echo fread($handle, $read_buffer);        $sum_buffer += $read_buffer;    }    //关闭句柄    fclose($handle);    exit;}

2.限制下载速率

/** * @param  $localFile 本地文件 * @param  $saveFileName  另存文件名 * @param  $downloadRate  下载速率 */function download_with_limitRate($localFile = '',$saveFileName = '',$downloadRate = 20.5){    if(file_exists($localFile) && is_file($localFile)) {        ob_clean();        header('Cache-control: private');        header('Content-Type: application/octet-stream');        header('Content-Length: '.filesize($localFile));        header('Content-Disposition: filename='.$saveFileName);        flush();        // 打开文件流        $file = fopen($localFile, "r");        while(!feof($file)) {            // 发送当前块到浏览器            print fread($file, round($downloadRate * 1024));            // 输出到浏览器            flush();            // sleep one second            sleep(1);        }        //关闭文件流        fclose($file);}    else {        die('Error: The file '.$localFile.' does not exist!');    }}

3.下载网络文件

function downloadFromUrl($url = '', $savePath = 'uploads/'){    set_time_limit(0);    ini_set('max_execution_time', '0');    $pi = pathinfo($url);    $ext = $pi['extension'];    $name = $pi['filename'];    $ch = curl_init();    curl_setopt($ch, CURLOPT_URL, $url);    curl_setopt($ch, CURLOPT_HEADER, false);    curl_setopt($ch, CURLOPT_BINARYTRANSFER, true);    curl_setopt($ch, CURLOPT_AUTOREFERER, true);    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);    $opt = curl_exec($ch);    curl_close($ch);    $saveFile = $name . '.' . $ext;    if (preg_match("/[^0-9a-z._-]/i", $saveFile)) {        $saveFile = $savePath . '/' . md5(microtime(true)) . '.' . $ext;    } else {        $saveFile = $savePath . '/' . $name . '.' . $ext;    }    $handle = fopen($saveFile, 'wb');    if(fwrite($handle, $opt)){        echo 'download success';    }    fclose($handle);    exit;}

4.获取网络文件大小

function remote_filesize($url, $user = "", $pw = ""){    ob_start();    $ch = curl_init($url);    curl_setopt($ch, CURLOPT_HEADER, 1);    curl_setopt($ch, CURLOPT_NOBODY, 1);    if (!empty($user) && !empty($pw)) {        $headers = array('Authorization: Basic ' . base64_encode("$user:$pw"));        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);    }    curl_exec($ch);    curl_close($ch);    $head = ob_get_contents();    ob_end_clean();    $regex = '/Content-Length:\s([0-9].+?)\s/';    preg_match($regex, $head, $matches);    return isset($matches[1]) ? $matches[1] : "unknown";}

总结:

1.通过header方式下载一定不能通过ajax方式请求

2.设置超时时间

3.设置memory_limit

4.在header之前ob_clean()

5.设置buffer大小

6.可以设置sleep()减轻内存压力

54e6cb709f4dfee12ce6be966325255a.png

58599d36859083a030b75a0c276ba24e.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值