You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:59:47