私は最近、ローカルおよびリモート (具体的には S3) ファイルシステムを抽象化する目的で、既存のアプリケーションで Flysystem を使い始めました。LocalAdapter を正常に構成した私の開発環境では、すべてが正常に機能していました。ただし、S3 ファイルのダウンロードが機能しません。AWS マネジメント コンソールで S3 バケットを手動で参照することでファイルを正常にダウンロードできることを考えると、ファイルのアップロードは完全に機能していることを指摘したいと思います。そうは言っても、$filesystem
変数を初期化するコードはスキップします。
私のアプリケーションは PSR-7 アプローチを使用しています。つまり、以下のコードは、Psr\Http\Message\ServerRequestInterface
最初の引数として型のオブジェクトが渡さPsr\Http\Message\ResponseInterface
れ、2 番目の引数として型のオブジェクトが渡される関数内にあります。ローカル ファイル システムが正常に動作していることを考えると、問題はそこにはないと考えて間違いないと思います。
これはコードです:
<?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 '';
});