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

React Native上传二进制图片至AWS S3遇400错误,求解决

解决React Native二进制POST上传base64图片到AWS S3的400错误

你的代码核心问题是直接传递本地文件URI作为请求体,Axios会将其当作字符串发送,不符合S3要求的二进制格式,导致400错误。以下是正确的实现步骤:

1. 将base64图片转换为二进制Blob

如果你的图片以base64字符串存储(格式通常为data:image/jpeg;base64,xxxxxx),需要先解码为Blob对象:

function base64ToBlob(base64Data, contentType = 'image/jpeg') {
  // 移除base64前缀
  const pureBase64 = base64Data.replace(/^data:image\/\w+;base64,/, '');
  const byteChars = atob(pureBase64);
  const byteArrays = [];

  for (let offset = 0; offset < byteChars.length; offset += 512) {
    const slice = byteChars.slice(offset, offset + 512);
    const byteNumbers = new Array(slice.length);
    for (let i = 0; i < slice.length; i++) {
      byteNumbers[i] = slice.charCodeAt(i);
    }
    byteArrays.push(new Uint8Array(byteNumbers));
  }

  return new Blob(byteArrays, { type: contentType });
}

2. 修改Axios请求逻辑

将转换后的Blob作为请求体发送,同时保留正确的请求头:

const session = await Auth.currentSession();

// 假设你的base64图片存在photo.base64中
const imageBlob = base64ToBlob(photo.base64, 'image/jpeg');

const config = {
  headers: {
    "Content-Type": "image/jpeg",
    "x-amz-acl": "public-read",
    Authorization: session.getIdToken().getJwtToken(),
  },
};

const API = `event/${eventData.id}/photos`;
const HOST = "https://host.com/";
const url = `${HOST}/${API}`;

try {
  const result = await axios.post(url, imageBlob, config);
  console.log("上传结果: ", result);
} catch (error) {
  // 打印详细错误信息,方便排查S3返回的具体问题
  console.error("上传失败: ", error.response?.data || error.message);
}

3. 本地URI(相机/相册获取)的处理

如果你的photo.uri是本地文件路径,需要先读取文件内容为base64,再转换为Blob。以Expo为例,使用expo-file-system读取:

import * as FileSystem from 'expo-file-system';

// 读取本地文件为base64
const base64Str = await FileSystem.readAsStringAsync(photo.uri, {
  encoding: FileSystem.EncodingType.Base64,
});
// 拼接完整base64格式字符串后转Blob
const imageBlob = base64ToBlob(`data:image/jpeg;base64,${base64Str}`);

关键注意事项

  • 确保Content-Type与实际图片类型完全匹配(比如PNG用image/png)
  • 捕获错误时优先打印error.response.data,AWS S3会返回具体的错误原因(比如权限问题、格式不匹配)
  • 确认Postman中使用的Authorization凭证与代码一致,避免凭证类型不匹配

内容的提问来源于stack exchange,提问作者Neta

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 10:20:25