使用Google API v3上传YouTube视频遇400错误:不支持application/json类型
解决YouTube API v3视频上传400错误(媒体类型不支持)
使用Google API v3向YouTube上传视频,昨日起突然出现400错误,但代码和服务器均未做任何改动。排查时发现google/apiclient包的src/Http/MediaFileUpload.php文件中设置了content-type为application/json; charset=UTF-8,怀疑是问题根源,寻求解决办法。
环境详情
- 操作系统:Linux
- PHP版本:8.1.8
- 包名称及版本:
google/apiclient: ^2.13.2 - Laravel版本:^9.0
错误信息
{ "error": { "code": 400, "message": "Media type 'application/json; charset=UTF-8' is not supported. ", "errors": [ { "message": "Media type 'application/json; charset=UTF-8' is not supported. ", "domain": "global", "reason": "badRequest" } ], "status": "INVALID_ARGUMENT" } }
代码示例
$chunkSizeBytes = 15 * 1024 * 1024; $client->setDefer(true); $insertRequest = $youtube->videos->insert("status,snippet,recordingDetails", $video , [ 'notifySubscribers' => true ]); $media = new MediaFileUpload( $client, $insertRequest, 'video/'.File::extension($videoPath), null, false, $chunkSizeBytes ); $media->setFileSize(File::size($videoPath)); $status = false; $handle = fopen($videoPath, "rb"); while (!$status && !feof($handle)) { $chunk = fread($handle, $chunkSizeBytes); $status = $media->nextChunk($chunk); } fclose($handle); $client->setDefer(false);
解决办法
1. 确保媒体类型参数正确
实例化MediaFileUpload时,第三个参数依赖File::extension($videoPath)生成MIME类型,要确保该方法返回的是有效视频后缀(如mp4、mov)。可以直接手动指定正确的MIME类型测试,比如替换为'video/mp4'。
2. 强制覆盖Content-Type请求头
如果默认的Content-Type被错误设置,可在实例化MediaFileUpload后手动强制指定正确的媒体类型:
$media = new MediaFileUpload( $client, $insertRequest, 'video/mp4', null, false, $chunkSizeBytes ); // 强制覆盖请求头 $media->getRequest()->setHeader('Content-Type', 'video/mp4');
3. 排查依赖包隐性更新
检查composer.lock文件,确认google/apiclient及其子依赖是否有意外版本变更。若有,可在composer.json中锁定到之前正常工作的版本:
"google/apiclient": "2.13.2"
执行composer update google/apiclient完成版本回退。
4. 验证视频文件有效性
确认视频文件未损坏,且符合YouTube支持的格式与编码要求。可使用ffmpeg工具检查视频信息:
ffmpeg -i your-video.mp4
内容的提问来源于stack exchange,提问作者Afshin Tavakolian
相关产品推荐
相关产品推荐

