使用PHP与Guzzle下载远程图片时出现0字节文件的问题排查
问题描述
尝试通过远程GraphQL API,使用PHP和Guzzle批量下载图片资源到Web服务器。所有请求返回200状态码,但生成的文件均为0字节,无法确定原因。
当前代码:
foreach ($images as $url) { $client = new Client([ 'base_uri' => 'https://removed.co.uk/api/graphql', 'auth' => [ 'removed', 'removed', ], ]); $request = $client->request('GET', '/resources/image/'. basename($url) .'', ['sink' => 'api_files/product_images/'. basename($url) .'']); echo $request->getStatusCode() . '<br />'; }
$images数组存储待下载图片的绝对路径,文件已成功生成在api_files/product_images/目录下,但所有文件大小均为0字节。
可能的原因及解决方法
- 请求路径拼接错误:你用
basename($url)拼接API请求路径,但$images里是图片的绝对路径,若原URL包含的文件名并非API接口期望的资源标识(比如实际需要的是图片ID而非原始文件名),会导致请求到的是一个空响应资源。建议打印完整请求URL验证:$targetPath = '/resources/image/'. basename($url); echo "请求路径:{$targetPath}<br />"; - Guzzle流处理未生效:部分场景下
sink参数可能未正确触发响应体写入,可尝试手动读取响应体并写入文件:$response = $client->request('GET', $targetPath); file_put_contents('api_files/product_images/'. basename($url), $response->getBody()->getContents()); - API返回空内容:状态码200不代表有有效响应体,可能是权限不足、资源不存在等原因导致API返回空内容。可打印响应体确认:
echo "响应内容:". $response->getBody()->getContents() ."<br />"; - 重复初始化Client实例:循环内每次新建
Client属于冗余操作,可能引发连接异常。建议将Client初始化移到循环外:$client = new Client([ 'base_uri' => 'https://removed.co.uk/api/graphql', 'auth' => [ 'removed', 'removed', ], ]); foreach ($images as $url) { $targetPath = '/resources/image/'. basename($url); $response = $client->request('GET', $targetPath, ['sink' => 'api_files/product_images/'. basename($url)]); echo $response->getStatusCode() . '<br />'; } - 文件路径或权限问题:相对路径可能导致写入位置异常,或PHP进程无足够写入权限。建议使用绝对路径并检查目录权限:
$sinkPath = __DIR__ . '/api_files/product_images/'. basename($url); $response = $client->request('GET', $targetPath, ['sink' => $sinkPath]);
内容的提问来源于stack exchange,提问作者DANVC
相关产品推荐
相关产品推荐

