ZIP下载的大小比使用PHP头的外部服务器上的实际大小要大

ZIP下载的大小比使用PHP头的外部服务器上的实际大小要大,php,http-headers,zip,Php,Http Headers,Zip,我们正在托管一些重文件,这些文件在我们的一个网站上被广告为免费下载。这些文件位于另一台服务器上,因此为了生成下载,我们执行以下代码: header("Cache-Control: public"); header("Content-Description: File Transfer"); header("Content-Type:application/octet-stream"); header("Content-Transfer-Encoding: binary"); header("C

我们正在托管一些重文件,这些文件在我们的一个网站上被广告为免费下载。这些文件位于另一台服务器上,因此为了生成下载,我们执行以下代码:

header("Cache-Control: public");
header("Content-Description: File Transfer");
header("Content-Type:application/octet-stream");
header("Content-Transfer-Encoding: binary"); 
header("Content-Disposition:attachment;filename='$fileName'");
readfile("http://mysiste.com/downloads/$fileName");
其中,
$fileName
是zip文件的名称。示例:myfile.zip 除了服务器上的myfile.zip是8Mb,它将以16Mb的速度下载之外,所有这些都可以正常工作!最疯狂的是,文件工作正常,解压文件时,里面的所有文件都是完整的,没有损坏

我猜这与头和传输编码有关,就好像zip文件失去了压缩一样

有什么想法吗

我认为你错过了一个重要的头球
标题(“内容长度:$size”)
此处。您可以使用
int filesize(string$filename)
查找文件大小。这是你的电话号码


我希望这有帮助

问题是文件是服务器外部的,我不知道;I don’我想我看不懂那样的尺码。另一个问题是,如果我不指定文件的大小,为什么文件会变大?我已经更新了答案,希望能解决您的问题。请查看链接。使用
curl
可以解决您的问题!非常感谢,我修改了你的答案并添加了解决问题的最终代码。谢谢!如果您还需要进一步的帮助,请告诉我!
<?php
$fileName = "downloaded.pdf"
$size = filesize($file);
header('Content-type: application/pdf');
header("Content-length: $size");
header("Content-Disposition: attachment; filename='$fileName'");
readfile($file);
?>
$url="http://mysite/downloads/$fileName";
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_HEADER, true); 
curl_setopt($ch, CURLOPT_NOBODY, true); // make it a HEAD request
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 
curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); 
$head = curl_exec($ch);

$mimeType = curl_getinfo($ch, CURLINFO_CONTENT_TYPE);
$size = curl_getinfo($ch, CURLINFO_CONTENT_LENGTH_DOWNLOAD);
$path = parse_url($url, PHP_URL_PATH);
$filename = substr($url, strrpos($path, '/') + 1);

curl_close($ch); 

header("Cache-Control: public");
header("Content-Description: File Transfer");
header("Content-Type:$mimeType");
header("Content-Disposition:attachment;filename='$fileName'");
header('Content-Length: '.$size);
readfile($url);