PHP文件下载总是损坏(50%的时间)
我有一个自动下载文件的脚本。 它可以完美地下载文件,但问题是,50%或更多的时间,它会下载一个损坏的文件 通常情况下,删除并再次下载是可行的,但并不总是如此 我怎样才能使这个下载100%的时间都完美无瑕? 文件大小根据下载的文件而变化PHP文件下载总是损坏(50%的时间),php,file,header,download,corrupt,Php,File,Header,Download,Corrupt,我有一个自动下载文件的脚本。 它可以完美地下载文件,但问题是,50%或更多的时间,它会下载一个损坏的文件 通常情况下,删除并再次下载是可行的,但并不总是如此 我怎样才能使这个下载100%的时间都完美无瑕? 文件大小根据下载的文件而变化 <?php // Automatically Start File Download if (isset($_GET['filename'])): $filename = $_GET['filename']; $domain = "htt
<?php
// Automatically Start File Download
if (isset($_GET['filename'])):
$filename = $_GET['filename'];
$domain = "http://www.domain.com";
$filepath = "/addons/downloads/websites/";
//BUILD THE FILE INFORMATION
$file = $domain . $filepath . $filename;
// echo $filepath . $filename;
// echo $file;
//CREATE/OUTPUT THE HEADER
if (file_exists("/home/unrealde/public_html/ebook/domain.com/".$filepath . $filename)):
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.basename($file));
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Content-Length: ' . filesize($file));
ob_clean();
flush();
readfile($file);
else:
$errorMsg = "<b>Download Error: File $filename Doesnt Exist!</b> <br />Please Contact <a href='mailto:support@domain.com'>support@domain.com</a>";
endif;
echo $errorMsg;
else:
// don't download any file
endif;
?>
尝试添加错误报告(0);在脚本的开头。只是为了好玩。如果您检查php.net中的readfile,其他人报告说这有帮助 我的直觉是,程序中的某些东西正在输出文件本身以外的数据
您是否在二进制编辑器中查看了损坏的文件,并将其与未损坏的版本进行了比较?您会发现,无论是在文件的开头还是结尾,都有一些意外的数据,这就是损坏文件的原因
如果您以这种方式查看该文件,问题可能会变得非常明显。例如,您可能有一个文件,后跟一条错误消息,在这种情况下,您的行echo$errorMsg代码>是罪魁祸首
或者,您可能有一些空白。这也可能是相同的错误消息,也可能是PHP标记上面或下面有空白行,正在打印
我的第一个建议是,由于程序在文件输出时有效地完成了,所以要放一个显式的die紧跟在readfile()之后的code>函数代码>行。这将绝对防止在文件发送后再输出任何虚假数据
如果坏数据是在readfile()之前发送的,那么这将没有帮助代码>,但它确实一下子排除了一半可能的问题。您不能只对内容进行tar/gzip/zip压缩,并提供tar/gzip/zip文件供下载吗
较小的文件传输比http传输更容易成功,
更重要的是,您可以为用户提供校验和以验证所以…如果它总是在50%的时间内损坏,那么它不应该被认为只在一半的时间内损坏吗?为什么有些东西总是在50%的时间内损坏?只是有争议:-)但是说真的,我想要一些帮助建议1:整理你的缩进-这会让你很难阅读代码。建议2:对if()
s使用大括号{}
符号,而不是冒号:
符号;再说一次,它更容易阅读。(它们只是建议,但在代码易于阅读时更容易提供帮助:-)“50%的时间,每次都有效。”下载前和下载后验证文件大小。如果它们不匹配,则废弃并再次下载(即校验和)。由于互联网的性质(数据包可能丢失),我们不可能保证“永远完美,不受腐蚀”,因此我们围绕这一点进行编程。gzip解决方案是一个好主意,假设您可以访问正在下载的文件(或拥有这些文件的服务器,并可以编写使用Zip()库的包装器函数)。您好。非常感谢。我已经添加了它,并将对其进行测试。如果不是这样,我该怎么做才能“突袭”文件的前半部分以避免添加数据?谢谢你的死了代码>建议对我有效,但前提是我同时放置退出代码>就在它之后(并删除了其他任何内容,如空格或echo
calls)。谢谢@Basheerdie
和exit
在PHP中是同义词;两者的作用完全相同。如果did
不起作用,则exit
不会有任何不同。因此,我认为在你的例子中,是删除所有空格和echo
s之后才产生了不同。哇,我真不敢相信我错过了。你完全正确。谢谢你指出这一点。