最近、ローカルとリモート(特にS3)ファイルシステムを抽象化する目的で、既存のアプリケーションでFlysystemを使用し始めました。 LocalAdapterを正常に設定した開発環境では、すべてが正常に機能していました。しかし、私はS3ファイルのダウンロードを動作させることはできません。 AWS管理コンソールでS3バケットを手動でブラウズしてファイルを正常にダウンロードできることを考慮して、ファイルアップロードが完全に機能していることを指摘したいと思います。つまり、私は$filesystem
変数を初期化するコードをスキップします。Flysystem S3のリモートファイルのダウンロードは常に破損しています
私のアプリケーションでは、PSR-7アプローチを使用しています。つまり、以下のコードは、第1引数としてタイプPsr\Http\Message\ServerRequestInterface
のオブジェクトと、第2引数としてタイプ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バイトです。
私はフライシステムが背後にあるすべてのものを処理していると仮定しています。クライアントに提供する前に、手動でファイルを一時フォルダに手動でダウンロードする必要はありません。
問題が発生する可能性がありますか?
アップデート1
私はまた、任意の運なしで、次のコードで試してみました。しかし、それはローカルで動作し続けます。Content-Lengthヘッダを削除
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 '';
});