我有一个自动下载文件的脚本。 它可以很好地下载文件,但问题是50%或更多的时间,它会下载一个损坏的文件。
通常删除和再次下载有效,但并非总是如此。
如何在100%的时间内完美地完成此下载,而不是损坏? 文件大小会根据下载的文件而改变。
<?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 :(得分:2)
我的预感是程序中的某些内容正在输出除文件本身以外的一些数据。
您是否在二进制编辑器中查看了损坏的文件并将其与非损坏版本进行了比较?你会发现,无论是在文件的开头还是结尾,你都有一些意想不到的数据,这就是破坏文件的原因。
如果您以这种方式查看该文件,问题可能会变得非常明显。例如,您可能有文件,后跟错误消息,在这种情况下,您的行echo $errorMsg;
可能是罪魁祸首。
或者您可能有一些空白。这也可能是相同的错误消息,或者可能是您的PHP标记在其上方或下方有空行,正在打印。
我的第一个建议是,因为程序在输出文件时有效完成,所以在die;
行之后立即放置一个明确的readfile();
函数。这将明确防止在文件发送后输出任何进一步的虚假数据。
如果在readfile();
之前发送错误数据,那将无济于事,但它确实排除了一半可能出现的问题。
答案 1 :(得分:1)
你不能只是tar / gzip / zip内容并提供tar / gzip / zip文件来代替吗?
较小的文件传输增加了http传输成功的机会,
更重要的是,您可以为用户提供校验和以进行验证
答案 2 :(得分:0)
尝试添加error_reporting(0);在脚本的开头。纯娱乐。如果你检查php.net的readfile,其他人报告这有帮助。