0

我最近开始在现有应用程序中使用 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 '';
});
4

1 回答 1

0

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

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

于 2017-03-15T09:43:00.057 回答