Laravel使用Guzzle向Google Drive上传文件报不支持内容类型错误
问题现象
我正尝试调用Google Drive v3 API上传文件,但是接口请求返回不支持内容错误,完全相同的请求在Postman中可以正常运行。对应实现代码如下:
$client = new Client(); $headers = [ 'Authorization' => 'Bearer '.$token, ]; $upload = $client->request('POST', 'https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart', [ 'multipart' => [ [ 'name' => 'metadata', 'contents' => json_encode($data) ], [ 'name' => 'media', 'contents' => file_get_contents($file) ] ], 'headers' => $headers, ]);
成功的Postman请求示例

请求头信息

data.json元数据配置
{ "name": "data.json", "parents": [ "<id here>" ] }
解决方案
报错的核心原因是你没有给multipart请求中的metadata字段指定正确的Content-Type请求头,Google Drive v3的multipart上传要求元数据部分的内容类型必须为application/json,Guzzle默认会给没有指定类型的multipart字段设置为text/plain,所以接口会返回不支持内容的错误。
修改后的代码如下:
$client = new Client(); $headers = [ 'Authorization' => 'Bearer '.$token, ]; $upload = $client->request('POST', 'https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart', [ 'multipart' => [ [ 'name' => 'metadata', 'contents' => json_encode($data), // 新增元数据的内容类型声明 'headers' => ['Content-Type' => 'application/json'] ], [ 'name' => 'media', 'contents' => file_get_contents($file), // 可选:如果上传的是特定类型文件,也可以补充对应Content-Type 'headers' => ['Content-Type' => mime_content_type($file)] ] ], 'headers' => $headers, ]);
如果修改后还是报错,可以检查下你的授权令牌是否拥有对应父目录的写入权限,以及父目录ID是否填写正确即可。
内容的提问来源于stack exchange,提问作者Dhamo
相关产品推荐
相关产品推荐

