从Laravel存储下载而不将整个文件加载到内存中

乔治

我正在使用Laravel Storage,我想为用户提供一些文件(大于内存限制)。我的代码是从SO的一篇文章获得灵感的,它是这样的:

$fs = Storage::getDriver();
$stream = $fs->readStream($file->path);

return response()->stream(
    function() use($stream) {
        fpassthru($stream);
    }, 
    200,
    [
        'Content-Type' => $file->mime,
        'Content-disposition' => 'attachment; filename="'.$file->original_name.'"',
    ]);

不幸的是,我遇到大文件错误:

[2016-04-21 13:37:13] production.ERROR: exception 'Symfony\Component\Debug\Exception\FatalErrorException' with message 'Allowed memory size of 134217728 bytes exhausted (tried to allocate 201740288 bytes)' in /path/app/Http/Controllers/FileController.php:131
Stack trace:
#0 /path/vendor/laravel/framework/src/Illuminate/Foundation/Bootstrap/HandleExceptions.php(133): Symfony\Component\Debug\Exception\FatalErrorException->__construct()
#1 /path/vendor/laravel/framework/src/Illuminate/Foundation/Bootstrap/HandleExceptions.php(118): Illuminate\Foundation\Bootstrap\HandleExceptions->fatalExceptionFromError()
#2 /path/vendor/laravel/framework/src/Illuminate/Foundation/Bootstrap/HandleExceptions.php(0): Illuminate\Foundation\Bootstrap\HandleExceptions->handleShutdown()
#3 /path/app/Http/Controllers/FileController.php(131): fpassthru()
#4 /path/vendor/symfony/http-foundation/StreamedResponse.php(95): App\Http\Controllers\FileController->App\Http\Controllers\{closure}()
#5 /path/vendor/symfony/http-foundation/StreamedResponse.php(95): call_user_func:{/path/vendor/symfony/http-foundation/StreamedResponse.php:95}()
#6 /path/vendor/symfony/http-foundation/Response.php(370): Symfony\Component\HttpFoundation\StreamedResponse->sendContent()
#7 /path/public/index.php(56): Symfony\Component\HttpFoundation\Response->send()
#8 /path/public/index.php(0): {main}()
#9 {main}  

似乎它试图将所有文件加载到内存中。我原以为使用stream和passthru不会做到这一点……我的代码中缺少某些内容吗?我是否必须以某种方式指定块大小或什么?

我使用的版本是Laravel 5.1和PHP 5.6。

克里斯蒂安

似乎输出缓冲仍在内存中累积很多。

尝试在执行fpassthru之前禁用ob:

function() use($stream) {
    while(ob_get_level() > 0) ob_end_flush();
    fpassthru($stream);
},

可能有多个活动的输出缓冲区处于活动状态,这就是为什么需要while的原因。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

合并大文件而不将整个文件加载到内存中?

来自分类Dev

反序列化消息而不将整个文件加载到内存中?

来自分类Dev

C#将字节数组追加到文件的开头(不将整个文件加载到内存中)

来自分类Dev

查找并追加到文件而不将其加载到内存中?

来自分类Dev

ZipArchive是否将整个zip文件加载到内存中

来自分类Dev

lxml的iterparse尝试将整个文件加载到内存中

来自分类Dev

C#更改文件编码而不将所有文件加载到内存中

来自分类Dev

逐行读取FileReader对象,而不将整个文件加载到RAM中

来自分类Dev

在Rebol中,如何复制文件而不将其加载到内存中?

来自分类Dev

我如何读取文件,而不将其加载到内存中,例如D中的Delphi TFileStream类?

来自分类Dev

有没有更快的方法可以搜索大文件而不将其加载到内存中?

来自分类Dev

Python FTP“块”迭代器(无需将整个文件加载到内存中)

来自分类Dev

Python FTP“块”迭代器(无需将整个文件加载到内存中)

来自分类Dev

PHP可以在不将文件加载到内存的情况下挂载到文件?

来自分类Dev

C#,循环遍历NHibernate对象而不将整个集合加载到内存的最佳方法

来自分类Dev

使用rest-client将文件下载到磁盘而不先将其全部加载到内存中

来自分类Dev

该查询是否将整个表加载到内存中

来自分类Dev

避免将整个 blob 加载到内存中

来自分类Dev

Node Js 如何在不将文件写入系统或不在目录中创建文件的情况下将文件下载到内存中

来自分类Dev

如何将数组存储在无法加载到内存的hdf5文件中?

来自分类Dev

在不将整个集合加载到DerbyJS 0.6中的情况下获取文档计数

来自分类Dev

Groovy:如何从两个文件中读取/比较行,而不将一个或两个文件加载到内存中

来自分类Dev

从XAML加载ResourceDictionary也将文件加载到内存中

来自分类Dev

Gensim 构建字典而不将所有文本加载到内存中 gensim

来自分类Dev

如何将大文件直接下载到磁盘,而不将其存储在服务器和浏览器的RAM中?

来自分类Dev

我如何将JSON从输入流写入S3文件而不将其全部加载到内存中?

来自分类Dev

提取文件中的随机行而不将文件加载到python中的RAM中

来自分类Dev

如何只访问一行而不将整个表存储在内存中?

来自分类Dev

下载文件,不加载到浏览器中

Related 相关文章

  1. 1

    合并大文件而不将整个文件加载到内存中?

  2. 2

    反序列化消息而不将整个文件加载到内存中?

  3. 3

    C#将字节数组追加到文件的开头(不将整个文件加载到内存中)

  4. 4

    查找并追加到文件而不将其加载到内存中?

  5. 5

    ZipArchive是否将整个zip文件加载到内存中

  6. 6

    lxml的iterparse尝试将整个文件加载到内存中

  7. 7

    C#更改文件编码而不将所有文件加载到内存中

  8. 8

    逐行读取FileReader对象,而不将整个文件加载到RAM中

  9. 9

    在Rebol中,如何复制文件而不将其加载到内存中?

  10. 10

    我如何读取文件,而不将其加载到内存中,例如D中的Delphi TFileStream类?

  11. 11

    有没有更快的方法可以搜索大文件而不将其加载到内存中?

  12. 12

    Python FTP“块”迭代器(无需将整个文件加载到内存中)

  13. 13

    Python FTP“块”迭代器(无需将整个文件加载到内存中)

  14. 14

    PHP可以在不将文件加载到内存的情况下挂载到文件?

  15. 15

    C#,循环遍历NHibernate对象而不将整个集合加载到内存的最佳方法

  16. 16

    使用rest-client将文件下载到磁盘而不先将其全部加载到内存中

  17. 17

    该查询是否将整个表加载到内存中

  18. 18

    避免将整个 blob 加载到内存中

  19. 19

    Node Js 如何在不将文件写入系统或不在目录中创建文件的情况下将文件下载到内存中

  20. 20

    如何将数组存储在无法加载到内存的hdf5文件中?

  21. 21

    在不将整个集合加载到DerbyJS 0.6中的情况下获取文档计数

  22. 22

    Groovy:如何从两个文件中读取/比较行,而不将一个或两个文件加载到内存中

  23. 23

    从XAML加载ResourceDictionary也将文件加载到内存中

  24. 24

    Gensim 构建字典而不将所有文本加载到内存中 gensim

  25. 25

    如何将大文件直接下载到磁盘,而不将其存储在服务器和浏览器的RAM中?

  26. 26

    我如何将JSON从输入流写入S3文件而不将其全部加载到内存中?

  27. 27

    提取文件中的随机行而不将文件加载到python中的RAM中

  28. 28

    如何只访问一行而不将整个表存储在内存中?

  29. 29

    下载文件,不加载到浏览器中

热门标签

归档