【问题标题】:Guzzle 6 download fileGuzzle 6 下载文件
【发布时间】:2019-12-25 23:10:00
【问题描述】:

在使用 Guzzle 6 从 REST API 下载文件时需要帮助。我不希望文件保存在本地,而是从网络浏览器下载。到目前为止的代码,但相信我遗漏了什么吗?

    <?php

//code for Guzzle etc removed

$responsesfile = $client->request('GET', 'documents/1234/content', 
        [
        'headers' => [
            'Cache-Control' => 'no-cache', 
            'Content-Type' => 'application/pdf',
            'Content-Type' => 'Content-Disposition: attachment; filename="test"'
        ]
        ]


    );
    return $responsesfile;
    ?>

【问题讨论】:

    标签: php guzzle guzzle6


    【解决方案1】:

    首先,Content-Type 标头仅在您发送内容(POST/PUT)时才有意义,但对于 GET 请求无效。

    其次,您的问题是什么?默认情况下,Guzzle 不会将响应正文(文件)存储在某处,因此您可以在应用程序中使用它,例如 $responsesfile-&gt;getBody()

    【讨论】:

      【解决方案2】:

      只需研究 Guzzle 的文档,例如 here

      传递一个字符串以指定将存储响应正文内容的文件的路径:

      $client->request('GET', '/stream/20', ['sink' => '/path/to/file']);
      

      传递从 fopen() 返回的资源以将响应写入 PHP 流:

      $resource = fopen('/path/to/file', 'w');
      $client->request('GET', '/stream/20', ['sink' => $resource]);
      

      传递 Psr\Http\Message\StreamInterface 对象以将响应正文流式传输到打开的 PSR-7 流。

      $resource = fopen('/path/to/file', 'w');
      $stream = GuzzleHttp\Psr7\stream_for($resource);
      $client->request('GET', '/stream/20', ['save_to' => $stream]);
      

      【讨论】:

      • 很好的答案,帮助 med 也找到了流解决方案。谢谢!
      • 好答案,我只想指出,如果您不存储对局部变量的响应,它会超出范围并且资源在您可以使用之前关闭。
      • 真的需要将响应保存在磁盘上吗?我不能直接将响应返回给客户端而不保存吗?
      【解决方案3】:

      stream_for 在 7.2 版中已弃用。您可以使用 GuzzleHttp\Psr7\Utils::streamFor($resource) 代替。

      【讨论】:

        猜你喜欢
        • 2016-04-27
        • 2015-11-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-20
        • 1970-01-01
        • 2015-10-29
        相关资源
        最近更新 更多