如何使用 php 下载文件?

How to download a file using php?

我想使用 php 从我的服务器下载文件。我搜索了 google 并找到了一个 Whosebug 答案 here。这个答案表明我必须为此目的编写这些代码。

$file_url = 'http://www.myremoteserver.com/file.exe';
header('Content-Type: application/octet-stream');
header("Content-Transfer-Encoding: Binary"); 
header("Content-disposition: attachment; filename=\"" . basename($file_url) .     "\""); 
readfile($file_url); 

但我只用这两行就可以做到这一点:

header("content-disposition:attachment; filename=uploads1/EFL1.5_Setup.exe");
readfile("uploads1/EFL1.5_Setup.exe");

那我为什么要像上面的代码那样多写几行呢?

header('Content-Type: application/octet-stream');

内容类型应该是已知的任何内容,如果您知道的话。 application/octet-stream 在 RFC 2046 中被定义为 "arbitrary binary data",并且这里有一个明确的重叠,它适用于其唯一目的是保存到磁盘的实体,并且从那时起在任何东西之外 "webby"。或者从另一个方向看; application/octet-stream 唯一可以安全地做的事情就是将它保存到文件中,并希望其他人知道它的用途。

header("Content-Transfer-Encoding: Binary"); 

Content-Transfer-Encoding 指定用于在 HTTP 协议内传输数据的编码,例如原始二进制或 base64。 (二进制比 base64 更紧凑。base64 有 33% 的开销)。

参考:

Do I need Content-Type: application/octet-stream for file download?

这里是下载文件的代码,其中包含下载的百分比信息:

<?php
$ch = curl_init();
$downloadFile = fopen( 'file name here', 'w' );
curl_setopt($ch, CURLOPT_URL, "file link here");
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_BUFFERSIZE, 65536);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_PROGRESSFUNCTION, 'downloadProgress'); 
curl_setopt($ch, CURLOPT_NOPROGRESS, false);
curl_setopt( $ch, CURLOPT_FILE, $downloadFile );
curl_exec($ch);
curl_close($ch);

function downloadProgress ($resource, $download_size, $downloaded_size, $upload_size, $uploaded_size) {

    if($download_size!=0){
        $percen= (($downloaded_size/$download_size)*100);
        echo $percen."<br>";
    }
}
?>