Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Zip文件下载,但无效吗?_Php_Download - Fatal编程技术网

Php Zip文件下载,但无效吗?

Php Zip文件下载,但无效吗?,php,download,Php,Download,我使用此代码让用户能够下载zip文件: if(file_exists($filename)){ header("Content-Disposition: attachment; filename=".basename(str_replace(' ', '_', $filename))); header("Content-Type: application/force-download"); header

我使用此代码让用户能够下载zip文件:

if(file_exists($filename)){
         header("Content-Disposition: attachment; filename=".basename(str_replace(' ', '_', $filename)));
         header("Content-Type: application/force-download");
         header("Content-Type: application/octet-stream");
         header("Content-Type: application/download");
         header("Content-Description: File Transfer");
         header("Content-Length: " . filesize($filename));
         flush();

         $fp = fopen($filename, "r");
         while (!feof($fp))
         {
             echo fread($fp, 65536);
             flush();
         }
         fclose($fp);
     exit;
}
下载该文件时,它只下载25632 KB的数据。但是zip文件是26252 KB

为什么浏览器获得全部25MB,但随后停止

我检查了
内容长度
标题,以确保它是正确的,并且是

编辑
在firefox中,当我下载文件时,它会显示“25mb”,因此浏览器认为25mb是完整的容量。。。但是,echo'd为26252904时的内容长度使用单个MIME类型来表示数据

在这种情况下,使用
application/octet-stream
就可以了。这是当你不知道之前的默剧。当你知道它的时候,你必须把它放进去。不要使用多个内容类型标题

通常,当浏览器不知道如何处理特定MIME时,它会触发下载过程。此外,使用
Content-disposition:Attachment确保它

存在一个简单的
readfile($filename)
,它将向请求进程发送文件的字节,如下所示:

header("Content-disposition: attachment;filename=" . basename($filename);
readfile($filename);

使用单个MIME类型来表示数据

在这种情况下,使用
application/octet-stream
就可以了。这是当你不知道之前的默剧。当你知道它的时候,你必须把它放进去。不要使用多个内容类型标题

通常,当浏览器不知道如何处理特定MIME时,它会触发下载过程。此外,使用
Content-disposition:Attachment确保它

存在一个简单的
readfile($filename)
,它将向请求进程发送文件的字节,如下所示:

header("Content-disposition: attachment;filename=" . basename($filename);
readfile($filename);
您的
标题('Content-Type…
调用无效,因为只有最后一个调用会发送到浏览器

下载由
内容处置:附件触发。如果要发送zip文件,则应发送实际的
内容类型:application/zip

最后,您的读取循环是不必要的

总而言之,您的代码应该如下所示:

如果(文件存在($filename)){
$quoted_filename=basename(addcslashes($filename,“\0..\37\”\177”);
标题(“内容处置:附件;文件名=\”{$quoted\U filename}\”);
标题(“内容类型:应用程序/zip”);
标题('Content-Length:'.filesize($filename));
readfile($filename);
}
您的
标题('Content-Type…
调用无效,因为只有最后一个调用会发送到浏览器

下载由
Content Disposition:attachment
触发。如果要发送zip文件,则应发送实际的
内容类型:application/zip

最后,您的读取循环是不必要的

总而言之,您的代码应该如下所示:

如果(文件存在($filename)){
$quoted_filename=basename(addcslashes($filename,“\0..\37\”\177”);
标题(“内容处置:附件;文件名=\”{$quoted\U filename}\”);
标题(“内容类型:应用程序/zip”);
标题('Content-Length:'.filesize($filename));
readfile($filename);
}

我也有类似的问题。该文件在Firefox中下载良好,但在IE中未下载。似乎Apache正在压缩文件,而IE无法解压缩,因此文件已损坏。解决方案是在Apache中禁用gzip。您还可以检查PHP是否正在运行并禁用gzip。 对于Apache,您可以尝试:

SetEnv no-gzip 1
对于PHP,在.htaccess中:

php_flag zlib.output_compression on

我也有类似的问题。该文件在Firefox中下载良好,但在IE中未下载。似乎Apache正在压缩文件,而IE无法解压缩,因此文件已损坏。解决方案是在Apache中禁用gzip。您还可以检查PHP是否正在运行并禁用gzip。 对于Apache,您可以尝试:

SetEnv no-gzip 1
对于PHP,在.htaccess中:

php_flag zlib.output_compression on

这个答案决不是真正的答案

但是我确实让它工作了。。。我刚刚将内容长度设置为30000000。因此,它认为文件比实际文件大,然后将其全部下载


丑陋的黑客我知道,但我找不到任何其他方法

这个答案绝不是真正的答案

但是我确实让它工作了。。。我刚刚将内容长度设置为30000000。因此,它认为文件比实际文件大,然后将其全部下载


丑陋的黑客我知道,但我找不到任何其他方法将其添加到您的代码之前

ob_clean();
ob_end_flush();

在代码之前添加此项

ob_clean();
ob_end_flush();

3种不同的内容类型?依我看,这是无效的。我从堆栈溢出中的另一个问题得到了整个函数。而且它被标记为有效的,并被投票支持。。。所以我认为这三种内容类型都不是问题!你能加入链接吗?3种不同的内容类型?依我看,这是无效的。我从堆栈溢出中的另一个问题得到了整个函数。而且它被标记为有效的,并被投票支持。。。所以我认为这三种内容类型都不是问题!你能插入链接吗?我试过你的回答。。。我的代码是标题(“内容处置:附件;文件名=“.basename($filename));标题(“内容类型:应用程序/八位字节流”);readfile($filename);但它只下载了1个字节的数据?你忘了
内容长度
标题了吗?我忘了。。。但我添加了
标题(“内容长度:”.filesize($filename))1KB
,它说
content length
是十进制的八位字节数。这和这有什么关系?你确定$filename指向正确的路径吗?可能会发出(抑制的)警告。如果不下载特定代码,请尝试:
echo filesize($filename)
我的文件名是:
$filename=“/home/www/sinensershighway.co.uk/media/sinensers Highway EP.zip”
回显文件大小($filename)返回26252904我尝试了您的响应。。。我的代码是header(“内容处置:附件;文件名”)