Удаленная загрузка файлов Flysystem S3 всегда повреждена

Недавно я начал использовать Flysystem в существующем приложении с целью абстрагирования локальной и удаленной (в частности, S3) файловых систем. Все работало нормально в моей среде разработки, в которой я успешно настроил LocalAdapter. Тем не менее, я не могу заставить загрузки файлов S3 работать. Я хотел бы отметить, что загрузка файлов работает отлично, учитывая, что я могу успешно загрузить файл, вручную просматривая корзину S3 в консоли управления AWS. При этом я пропущу код, который инициализирует $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 ответ

Удаление заголовка Content-Length, кажется, решает проблему.

См. https://github.com/thephpleague/flysystem/issues/543 для получения более подробной информации.

Другие вопросы по тегам