如何使用PHP的Guzzle发送ZIP文件?
解决Guzzle上传ZIP文件的问题,附Curl备选方案
我之前也碰到过类似的ZIP文件上传坑,咱们先把Guzzle的正确用法理清楚,再给你Curl的兜底方案。
一、Guzzle的正确实现方式
你之前用multipart方式时,核心问题出在contents用了file_get_contents读取文件内容——对于ZIP这类二进制文件,Guzzle更推荐用文件资源流来传递,这样既避免大文件占用过多内存,也能让后端正确识别为文件类型。
试试这个修改后的代码:
$filePath = $path . $name; $res = $client->request('POST', $this->base_api . $endpoint, [ 'auth' => [env('API_USERNAME'), env('API_PASSWORD')], 'multipart' => [ [ 'name' => 'FileContents', // 必须和后端接收的字段名完全匹配 'contents' => fopen($filePath, 'rb'), // 用资源流代替字符串内容 'filename' => $name // 确保文件名带.zip后缀,帮助后端识别类型 ], [ 'name' => 'FileInfo', 'contents' => json_encode($fileinfo) ] ], // 可选:开启调试查看请求原始内容,方便排查问题 'debug' => true ]);
关键修正点:
- 替换
file_get_contents为fopen($filePath, 'rb'),传递文件资源流而非字符串 - 确认
name字段和后端期望的接收名称一致(比如后端是不是用$_FILES['FileContents']获取文件) - 确保
filename包含.zip后缀,避免后端无法识别文件类型
如果还是有问题,打开debug选项查看请求的原始数据,检查multipart边界、文件内容是否正确传递。
二、Curl的备选实现方案
如果Guzzle的方式依然不顺畅,直接用Curl写也是非常靠谱的,这里给你完整的可运行代码:
$filePath = $path . $name; $url = $this->base_api . $endpoint; $username = env('API_USERNAME'); $password = env('API_PASSWORD'); // 初始化Curl $ch = curl_init(); // 构建multipart表单数据,用CURLFile专门处理文件上传 $postData = [ 'FileInfo' => json_encode($fileinfo), 'FileContents' => new CURLFile($filePath, 'application/zip', $name) ]; // 设置Curl核心选项 curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $postData); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 设置基础认证 curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); curl_setopt($ch, CURLOPT_USERPWD, "$username:$password"); // 可选:开启调试模式查看请求细节 // curl_setopt($ch, CURLOPT_VERBOSE, true); // 执行请求并处理结果 $response = curl_exec($ch); if (curl_errno($ch)) { $errorMsg = curl_error($ch); // 这里可以添加错误处理逻辑 } curl_close($ch); // 处理返回的响应内容 var_dump($response);
Curl的优势:
直接使用CURLFile类处理文件上传,PHP会自动帮你设置正确的multipart/form-data请求头和文件元信息,后端能正常通过$_FILES获取到ZIP文件。
额外排查建议
- 后端确认接收格式:确保后端是按照
multipart/form-data格式解析请求,而非其他格式 - 测试小文件:先用一个几KB的测试ZIP文件上传,排除大文件上传的服务器限制问题
- 检查文件权限:确认执行脚本的用户有读取目标ZIP文件的权限
内容的提问来源于stack exchange,提问作者SergejV
相关产品推荐
相关产品推荐

