Laravel:使用 response()->stream() 随机下载外部文件会导致下载损坏



我将存储在CDN上的文件,可下载。这些文件最多可以是100 MB,因此我使用的是简单的块方法(下图(。

下载有效,但是某些文件(主要是PDF-S(最终被损坏并且无法打开。

任何人都可以指出代码中的缺陷或陷阱吗?

我能想到的一件事是,标题没有以某种方式及时发送。另一个是某些文件未保存在UTF-8中,这可能会导致问题完全读取文件。我被困住了。

下载logic(使用stream(((:

$url = 'http://example.com/files/example.pdf';
$headers = array(
    'Pragma' => 'public',
    'Expires' => '0',
    'Content-Transfer-Encoding' => 'binary',
    'Cache-Control' => 'must-revalidate, post-check=0, pre-check=0',
    'Content-Type' => 'application/octet-stream',
    'Content-Disposition' => 'attachment; filename="example.pdf"'
);
return response()->stream(function() use ($url) {
    $this->readfileChunked($url);
},200, $headers);

块:

/**
 * Serves the given file in chunks.
 * Source: http://cn2.php.net/manual/en/function.readfile.php#52598
 *
 * @param      $filename
 * @param bool $retbytes
 *
 * @return bool|int
 */
public function readfileChunked($filename, $retbytes = true) {
    $chunkSize = 1024 * 1024; // Size (in bytes) of tiles chunk
    $cnt = 0;
    $handle = fopen($filename, 'rb');
    if ($handle === false) {
        return false;
    }
    while (!feof($handle)) {
        $buffer = fread($handle, $chunkSize);
        echo $buffer;
        ob_flush();
        flush();
        if ($retbytes) {
            $cnt += strlen($buffer);
        }
    }
    $status = fclose($handle);
    if ($retbytes && $status) {
        return $cnt; // return number of bytes delivered like readfile() does
    }
    return $status;
}

您是否尝试过使用:

return response()->file($url, $headers);

这是否导致损坏的文件(例如流方式(?

相关内容

  • 没有找到相关文章

最新更新