Я использую Flysystem в приложении Symfony для управления загрузкой / скачиванием файлов на S3.
$downloadableFileStream = $this->get("filesystem")->readStream($document->getDocument()),
$mimeType = $this->get("filesystem")->getMimetype($document->getDocument()),
$filename =$document->getDocument()
if (ob_get_level()) ob_end_clean();
return new StreamedResponse(function () use ($downloadableFileStream, $mimeType, $filename) {
fpassthru($downloadableFileStream);
}, 200, [
'Content-Transfer-Encoding', 'binary',
'Content-Type' => "application/octet-stream",
'Content-Disposition' => ('attachment; filename = "' . $filename . '"'),
'Content-Length' => fstat($downloadableFileStream)['size'],
]);
Это действительно медленно для больших файлов, я думал, что использование потока не помещает все файлы в память, может быть, я что-то делаю не так? (у меня такая же проблема с загрузкой, я использую putStream).
Для небольших файлов загрузка происходит мгновенно, но для больших файлов кажется, что весь файл загружается в файловую систему перед запуском загрузки.
Есть ли способ "начать" загрузку не получить весь файл?
Какие-либо предложения ?
Спасибо :)






попробуйте добавить flush(); после fpassthru($downloadableFileStream);
так это будет выглядеть
fpassthru($downloadableFileStream);
flush();
Также вам не нужны $mimeType и $filename в использовании
@BenjaminB. как насчет веб-сервера? может быть, это еще и буферизация вывода?
я не понимаю о чем ты
Я имею в виду, что PHP может работать нормально, но веб-сервер также буферизует putput (nginx или apache, что бы вы ни использовали)
я отключил nginx proxy_buffering off; и это то же самое :)
Я исправил проблему временно, получив файл с прямого защищенного частного URL-адреса S3. возможно то, что я хочу сделать, невозможно
То же самое, для файла 3mo, новая страница открывается, подождите 5 секунд, и файл сразу становится доступным. мне нужно начать загрузку, например, если я использую прямой URL-адрес (но я не могу, потому что этот сегмент является частным)