【问题标题】:How to download a file using php?如何使用php下载文件?
【发布时间】:2015-07-04 14:33:46
【问题描述】:

我想使用 php 从我的服务器下载文件。我搜索了谷歌并找到了一个stackoverflow答案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");

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

【问题讨论】:

  • 因为你现在做错了。文件名包含一个文件夹,您不知道该文件是什么类型。当然,它可能会起作用。但它也可能不会。请阅读这些标题上的文档。
  • 你可以用这个。 file_put_contents($_SERVER['DOCUMENT_ROOT']."/directory", $file_url);第一个参数是文档根。第二个是你的文件。
  • 好的,我会做,但如果它现在可以工作,为什么将来不能工作?

标签: php file download http-headers


【解决方案1】:

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

<?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>";
    }
}
?>

【讨论】:

  • 为什么这被否决了?这个答案有什么问题?
【解决方案2】:
header('Content-Type: application/octet-stream');

内容类型应该是已知的,如果你知道的话。 application/octet-stream 在 RFC 2046 中被定义为“任意二进制数据”,这里有明确的重叠,它适用于其唯一预期目的是保存到磁盘的实体,并且从那时起就在任何东西之外“韦比”。或者换个角度看;唯一可以安全使用 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?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-20
    • 2015-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-05
    • 1970-01-01
    • 2011-11-16
    相关资源
    最近更新 更多