如何用Axios调用Google Drive API上传文件?始终返回400错误
解决Google Drive可恢复上传的400 Bad Request问题
看起来你在实现Google Drive可恢复上传时碰到了400错误,我帮你梳理下代码里的几个关键问题,这些应该就是导致报错的核心原因:
1. 请求体格式与Content-Type冲突
可恢复上传的**初始化请求(第一步)**需要发送JSON格式的文件元数据,而你当前用FormData构造请求体,同时设置Content-Type为application/json,这两者完全冲突,服务器根本无法正确解析你的请求内容,直接触发400错误。
2. 元数据字段设置错误
- 你把
mimeType的值设成了this.state.title,这明显不符合要求——它应该是音频文件的MIME类型(比如audio/mpeg),可以直接从this.state.file.type获取,或者设置兜底值。 parents参数在元数据里需要是数组格式("parents": ["文件夹ID"]),而不是FormData的parents[]写法。
3. Content-Length设置错误
初始化请求的Content-Length应该是元数据JSON的长度,而不是你设置的文件大小。实际上Axios会自动计算这个值,完全不需要手动设置。
修正后的代码示例
// 构造正确的文件元数据JSON const fileMetadata = { name: `sermon-${Date.now()}.mp3`, originalFilename: this.state.file.name, mimeType: this.state.file.type || 'audio/mpeg', // 兜底处理文件类型为空的情况 parents: [SERMON_FOLDER] }; // 第一步:发送元数据,获取上传URL Axios.post(`https://www.googleapis.com/upload/drive/v3/files?uploadType=resumable`, fileMetadata, { headers: { 'Content-Type': 'application/json; charset=UTF-8', Authorization: `Bearer ${response.data.token}` } }) .then(initResponse => { // 初始化成功后,从响应头拿到后续上传用的URL const uploadUrl = initResponse.headers.location; // 第二步:用拿到的URL上传实际文件内容 return Axios.put(uploadUrl, this.state.file, { headers: { 'Content-Type': this.state.file.type || 'audio/mpeg' }, onUploadProgress: (progressEvent) => { const percentCompleted = Math.round((progressEvent.loaded * 100) / progressEvent.total); this.setState({ progress: percentCompleted }); } }); }) .then(finalResponse => { console.log(finalResponse.data); this.setState({ isLoading: false }); ToastAndroid.show('Upload Successful, Your Sermon has been uploaded', 2500); this.props.navigation.navigate('Admin'); }) .catch(error => { console.error('上传出错:', error.response?.data || error.message); this.setState({ isLoading: false }); ToastAndroid.show('Connection Error', 3000); });
额外提醒:可恢复上传是分两步的——先发送元数据获取上传地址,再用该地址上传文件内容,你之前的代码把两步合并成了一步,这也是错误的根源之一。另外要确保你的refresh_token拥有足够的权限(比如https://www.googleapis.com/auth/drive.file),权限不足也可能引发类似的错误。
内容的提问来源于stack exchange,提问作者Andrew Ogaga
相关产品推荐
相关产品推荐

