Flysystem S3远程文件下载始终损坏



我最近开始在现有应用程序中使用Flysystem,目的是抽象本地和远程(特别是S3)文件系统。在我的开发环境中,一切正常,我成功地配置了LocalAdapter。但是,我无法下载S3文件。我想指出的是,鉴于我可以通过在AWS管理控制台中手动浏览S3存储桶来成功下载文件,因此文件上传正常工作。话虽如此,我将跳过初始化$filesystem变量的代码。

我的应用程序正在使用PSR-7方法。也就是说,下面的代码在一个函数内部,该函数传递了一个类型PsrHttpMessageServerRequestInterface作为第一个参数的对象,而将PsrHttpMessageResponseInterface类型的对象作为第二个参数。鉴于本地文件系统工作正常,我认为可以肯定地假设问题不在那里。

这是代码:

<?php
    $stream = new ZendDiactorosStream($filesystem->readStream($filename));
    $filesize = $stream->getSize();
    return $response
            ->withHeader('Content-Type', 'application/pdf')
            ->withHeader('Content-Transfer-Encoding', 'Binary')
            ->withHeader('Content-Description', 'File Transfer')
            ->withHeader('Pragma', 'public')
            ->withHeader('Expires', '0')
            ->withHeader('Cache-Control', 'must-revalidate')
            ->withHeader('Content-Length', "{$filesize}")
            ->withBody($stream);

当我转储$stream变量和$filesize变量时,结果如预期。远程文件内容已成功打印。但是,文件下载始终损坏,文件大小始终为0个字节。

我假设Flysystem在幕后照顾所有内容,并且在将文件提供给客户之前,我不必先手动将文件下载到临时文件夹中。

有什么问题可能是问题?

更新1

我还尝试了以下代码,没有任何运气。但是,它继续在本地工作:

use ZendDiactorosCallbackStream;
$stream = new CallbackStream(function() use ($filesystem, $filename) {
     $resource = $filesystem->readStream($filename);
     while (!feof($resource)) {
         echo fread($resource, 1024);
     }
     fclose($resource);
     return '';
});

use ZendDiactorosCallbackStream;
$stream = new CallbackStream(function() use ($filesystem, $filename) {
     $resource = $filesystem->readStream($filename);
     fpassthru($resource);
     return '';
});

删除内容长度的标头似乎解决了问题。

有关更多详细信息

最新更新