从服务器下载 zip 文件导致意外结果。
Downloading zip file from server causing unexpected results.
我的服务器上有一个 zip 文件,我有一小段代码可以下载它,但是当我打开它时,它是空的,但当我直接从服务器上将它拉出时,文件大小仍然相同。
我已确保所有 php 标签在其 opening/closing 之前或之后都没有空格,并且尝试了在整个网站上发现的许多不同解决方案,但其中 none工作了。我还仔细检查以确保 zip 在服务器端也没有损坏。
public function adownload()
{
$file = "template.zip";
if (file_exists($file))
{
header('Content-Description: File Transfer');
header('Content-Type: application/zip');
header('Content-Disposition: attachment; filename="'.basename($file).'"');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($file));
readfile($file);
}
}
感谢任何建议。
我找到了一个关于所有可能引发错误的小指南,在我的例子中是我的 类 有结尾的 ?> 标签。删除后,一切正常。
Guide to removing problems
您的浏览器正在下载完成前关闭连接。这会导致一个空的存档 zip 目录。
原因是服务器负载过重
解决方案通过将流分成更小的块来调整服务器的节奏。而不是 readfile()
使用此代码:
set_time_limit(0); //prevent server timeout
$chunk_size = 1024 * 8; //set the chunk size to 8kB
$handle = fopen($file, 'rb');
$buffer = '';
while (!feof($handle)) {
$buffer = fread($handle, $chunk_size);
echo $buffer;
flush();
ob_flush();
sleep(1); // take a break
}
fclose($handle);
我的服务器上有一个 zip 文件,我有一小段代码可以下载它,但是当我打开它时,它是空的,但当我直接从服务器上将它拉出时,文件大小仍然相同。
我已确保所有 php 标签在其 opening/closing 之前或之后都没有空格,并且尝试了在整个网站上发现的许多不同解决方案,但其中 none工作了。我还仔细检查以确保 zip 在服务器端也没有损坏。
public function adownload()
{
$file = "template.zip";
if (file_exists($file))
{
header('Content-Description: File Transfer');
header('Content-Type: application/zip');
header('Content-Disposition: attachment; filename="'.basename($file).'"');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($file));
readfile($file);
}
}
感谢任何建议。
我找到了一个关于所有可能引发错误的小指南,在我的例子中是我的 类 有结尾的 ?> 标签。删除后,一切正常。 Guide to removing problems
您的浏览器正在下载完成前关闭连接。这会导致一个空的存档 zip 目录。
原因是服务器负载过重
解决方案通过将流分成更小的块来调整服务器的节奏。而不是 readfile()
使用此代码:
set_time_limit(0); //prevent server timeout
$chunk_size = 1024 * 8; //set the chunk size to 8kB
$handle = fopen($file, 'rb');
$buffer = '';
while (!feof($handle)) {
$buffer = fread($handle, $chunk_size);
echo $buffer;
flush();
ob_flush();
sleep(1); // take a break
}
fclose($handle);