Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.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文件下载总是损坏(50%的时间)_Php_File_Header_Download_Corrupt - Fatal编程技术网

PHP文件下载总是损坏(50%的时间)

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

我有一个自动下载文件的脚本。 它可以完美地下载文件,但问题是,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);在脚本的开头。只是为了好玩。如果您检查php.net中的readfile,其他人报告说这有帮助

我的直觉是,程序中的某些东西正在输出文件本身以外的数据

您是否在二进制编辑器中查看了损坏的文件,并将其与未损坏的版本进行了比较?您会发现,无论是在文件的开头还是结尾,都有一些意外的数据,这就是损坏文件的原因

如果您以这种方式查看该文件,问题可能会变得非常明显。例如,您可能有一个文件,后跟一条错误消息,在这种情况下,您的行
echo$errorMsg是罪魁祸首

或者,您可能有一些空白。这也可能是相同的错误消息,也可能是PHP标记上面或下面有空白行,正在打印

我的第一个建议是,由于程序在文件输出时有效地完成了,所以要放一个显式的
diereadfile()之后的code>函数行。这将绝对防止在文件发送后再输出任何虚假数据


如果坏数据是在
readfile()之前发送的,那么这将没有帮助,但它确实一下子排除了一半可能的问题。

您不能只对内容进行tar/gzip/zip压缩,并提供tar/gzip/zip文件供下载吗

较小的文件传输比http传输更容易成功,

更重要的是,您可以为用户提供校验和以验证

所以…如果它总是在50%的时间内损坏,那么它不应该被认为只在一半的时间内损坏吗?为什么有些东西总是在50%的时间内损坏?只是有争议:-)但是说真的,我想要一些帮助建议1:整理你的缩进-这会让你很难阅读代码。建议2:对
if()
s使用大括号
{}
符号,而不是冒号
符号;再说一次,它更容易阅读。(它们只是建议,但在代码易于阅读时更容易提供帮助:-)“50%的时间,每次都有效。”下载前和下载后验证文件大小。如果它们不匹配,则废弃并再次下载(即校验和)。由于互联网的性质(数据包可能丢失),我们不可能保证“永远完美,不受腐蚀”,因此我们围绕这一点进行编程。gzip解决方案是一个好主意,假设您可以访问正在下载的文件(或拥有这些文件的服务器,并可以编写使用Zip()库的包装器函数)。您好。非常感谢。我已经添加了它,并将对其进行测试。如果不是这样,我该怎么做才能“突袭”文件的前半部分以避免添加数据?谢谢你的
死了建议对我有效,但前提是我同时放置
退出就在它之后(并删除了其他任何内容,如空格或
echo
calls)。谢谢@Basheer
die
exit
在PHP中是同义词;两者的作用完全相同。如果
did
不起作用,则
exit
不会有任何不同。因此,我认为在你的例子中,是删除所有空格和
echo
s之后才产生了不同。哇,我真不敢相信我错过了。你完全正确。谢谢你指出这一点。