我需要使用Guzzle下载文件。目前,我正在使用6.3.3版。
我将sink
选项传递给了我的请求,但是尽管我请求的API响应“ 200 OK”并带有一些正文内容,但目标文件始终为空。
这是我到目前为止的代码:
// sidenote:
// $this->importFile is the absolute path to the file the contents have to be downloaded to
// $this->api is a GuzzleHttp\Client, base URL has been set previously
// $uri is the API endpoint's URI I am requesting (like "get/data")
// $this->getQueryParams() returns an array with a few needed parameters
$downloadDestination = fopen($this->importFile, 'w');
$response = $this->api->get($uri, [
'query' => $this->getQueryParams(),
'sink' => $downloadDestination,
]);
var_dump(file_get_contents($this->importFile));
var_dump($response->getBody()->getContents());
die;
顺便说一句,我是在命令(bin/console blah:custom-command
)中的Symfony(3.4)应用程序的上下文中调用此函数。上面的代码段是我的服务类之一的一部分。
这将导致一个新创建但为空的文件,并在我的终端中显示以下输出:
string(0) ""
string(2065) "{"id":"123", … }"
# the latter one is actually a large JSON string, I just shortened it here
有人知道我在做什么错吗?实际上,这不是火箭科学。现在,我对下载的目标文件已创建但无法写入的内容感到更加困惑……
Guzzle或类似的东西是否缺少某种配置?
答案 0 :(得分:0)
当它!绝对是我自己的错我也应该发布Guzzle Client的初始化。然后我可以早一点发现我的错误……
$this->api = new Client([
'base_uri' => $apiBaseUrl,
'stream' => true,
]);
在我添加sink
选项(以文件形式下载响应主体)之前,我的服务类必须逐行处理响应(因为我使用的API响应的数据最大为1 GB)尺寸)。因此,我也预先添加了stream
选项。此人正在与sink
发生冲突。
因此,我的解决方案是简单地从客户端的初始化中删除stream
选项。 –等等。可以。