Удаленная загрузка файлов 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 для получения более подробной информации.