从服务器 PHP 下载后文件损坏

Posted

技术标签:

【中文标题】从服务器 PHP 下载后文件损坏【英文标题】:Broken files after download from server PHP 【发布时间】:2015-07-04 08:57:51 【问题描述】:

我有从服务器下载种子文件的脚本:

header("Pragma: public");
        header("Expires: 0");
        header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
        header("Cache-Control: private");
        header("Content-Description: File Transfer");
        header("Content-Type: application/x-bittorrent");
        header('Content-Length: '.filesize($local));
        header("Content-Disposition: attachment; filename=\"".$local."\"");
        $file = fopen($local, "r");
        print fread($file, filesize($local));
        fclose($file); 

如果我下载文件,torrent 已损坏且无法使用,任何人都可以帮助我吗? 错误是:

Torrent 文件解码失败!请尝试重新下载种子!

编辑:

$path = 'torrent/'; 
$local = $path.$row['file_src']; 

我做了一些小改动

header('Cache-control: private');
    header('Content-Type: application/x-bittorrent');
    header('Content-Length: '.filesize($local));
    header('Content-Disposition: filename='.$download);
    $file = fopen($local, "r"); 
    print fread($file, filesize($local)); 
    fclose($file);

编辑: 抱歉,但总的来说这不是问题,谢谢@deceze,问题出在 torrent 文件中,下载后有一行。我该如何修复它?

【问题讨论】:

“torrent 已损坏”是什么意思?文件包含什么?给我们看一看!还是只是种子不再可用? 种子文件解码失败!请尝试重新下载种子! 你能确认你所有的标题都是正确的吗?您的过期值可能是 > 0 但低于时间的值?您还需要在最后的 header 行上使用不同的引号,因为标题包含在 " 中,但您的文件名需要包含在 ' 引号中,而不是更多“。 我做了一点改动 header('Cache-control: private'); header('Content-Type: application/x-bittorrent'); header('内容长度:'.filesize($local)); header('Content-Disposition: filename='.$download); $file = fopen($local, "r"); // otwieramy nasz lokalny plik print fread($file, filesize($local)); // wrzucamy do przeglÄ...darki odczyt, czyli wywoĹ‚ujemy Ĺ›ciÄ...gniÄ™cie fclose($file); 我的问题是:下载的文件包含什么。如果你双击它不会发生什么。为什么不能直接进去看看?看看发生了什么? 【参考方案1】:
  header("Content-Disposition: attachment; filename=\"".$local."\"");

这一行是一个问题,因为您的标题文本包含在 " 中,但您的文件名子部分也包含在 " 中,因此代码无法理解使用相同引号的两个层,因此请将其更改为:

  header("Content-Disposition: attachment; filename='".$local."'");

这维护了标头的引用结构。

【讨论】:

如果我使用你的方法,文件名是'file.torrent' 那么$local 的值是多少,它没有在您的代码示例中设置,例如@MaxFosterr $path = 'torrent/'; $local = $path.$row['file_src']; 这就是\ 的用途,这里没有问题。 是的@deceze 指出得很好。我重读了我的帖子,不敢相信我看错了。便便:(

以上是关于从服务器 PHP 下载后文件损坏的主要内容,如果未能解决你的问题,请参考以下文章

节点在下载后写入损坏的.xlsx文件

使用 PHP 从数据库下载“blob”类型文件。文件已损坏,无法查看文件内容

设置文件大小时php下载限制zip损坏

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

从nodejs服务器下载文件在客户端下载为损坏的文件

PHP强制下载.xlsx文件损坏