如何使用 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>";
}
}
?>
我想使用 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>";
}
}
?>