0

私は最近、ローカルおよびリモート (具体的には 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 '';
});
4

1 に答える 1