使用GuzzleHttp上传文件至Box失败报415错误,求解决方案
解决Box文件上传的415错误 & 优化Guzzle实现
嘿,这个415错误其实很好搞定——问题出在你设置的请求类型和参数结构上。Box的文件上传接口要求用multipart/form-data来发送请求(毕竟要传文件二进制数据),而不是你用的application/x-www-form-urlencoded,而且参数的组织方式也得调整。
下面是修正后的GuzzleHttp实现代码,这也是贴合Box API规范的最优写法:
use GuzzleHttp\Client; use GuzzleHttp\Psr7\Utils; // 初始化Guzzle客户端 $client = new Client(); try { $response = $client->request('POST', 'https://upload.box.com/api/2.0/files/content', [ 'headers' => [ 'Authorization' => "Bearer {$access_token}", // 这里不用手动设置Content-Type,Guzzle会自动处理multipart请求的类型 ], 'multipart' => [ // attributes参数需要转成JSON字符串传给Box [ 'name' => 'attributes', 'contents' => json_encode([ 'name' => $file, // 上传后显示的文件名 'parent' => ['id' => $parent_id] // 父文件夹ID,注意是键值对格式 ]) ], // 要上传的文件部分,用文件流的方式更可靠 [ 'name' => 'file', 'contents' => Utils::tryFopen($filePath, 'r'), 'filename' => $file // 可选,如果想让上传后的文件名和本地文件不同,可以改这里 ] ] ]); // 解析并处理上传结果 $uploadResult = json_decode($response->getBody(), true); print_r($uploadResult); } catch (\GuzzleHttp\Exception\ClientException $e) { // 捕获错误时输出详细响应,方便排查Box返回的具体问题(比如权限、文件名重复) echo '错误提示: ' . $e->getMessage() . PHP_EOL; echo 'Box返回详情: ' . $e->getResponse()->getBody()->getContents() . PHP_EOL; }
关键细节拆解:
- 用
multipart选项替代手动设置Content-Type:Guzzle会自动生成带boundary的multipart/form-data类型头,完全符合Box的要求。 attributes必须是JSON字符串:Box API明确要求这个参数是JSON格式,所以一定要用json_encode()把数组转成字符串。- 文件流上传更稳妥:
Utils::tryFopen()是Guzzle推荐的文件处理方式,不仅能避免文件读取失败的问题,对大文件上传也更友好。 - 优化错误捕获:catch块里输出Box的响应内容,能帮你快速定位除了415之外的其他问题(比如权限不足、父文件夹不存在等)。
如果需要上传超过50MB的大文件,Box推荐用分块上传API,不过上面的代码足够覆盖绝大多数常规文件上传场景啦。
内容的提问来源于stack exchange,提问作者Manojkumar
相关产品推荐
相关产品推荐

