Flysystem S3远程文件下载总是损坏

时间:2017-03-14 18:52:06

标签: php zend-framework2 middleware flysystem psr-7

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

我的应用程序使用的是PSR-7方法。也就是说,下面的代码位于一个函数内部,该函数作为第一个参数传递类型为Psr\Http\Message\ServerRequestInterface的对象,而作为第二个参数传递类型为Psr\Http\Message\ResponseInterface的对象。鉴于本地文件系统工作正常,我认为可以安全地假设问题并不存在。

这是代码:

<?php

    $stream = new \Zend\Diactoros\Stream($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 Zend\Diactoros\CallbackStream;

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

use Zend\Diactoros\CallbackStream;

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

1 个答案:

答案 0 :(得分:0)

删除Content-Length标头似乎可以解决问题。

有关详细信息,请参阅https://github.com/thephpleague/flysystem/issues/543