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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 06:25:27