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

React Native安卓端使用aws-sdk上传S3报Missing Bucket参数错误

问题原因
  • 你使用的AWS SDK for JavaScript v2版本在React Native安卓端运行时(尤其是开启Hermes引擎的场景),不会自动继承S3实例初始化时传入的全局Bucket配置,iOS端的JS运行时会自动继承该配置,因此出现双端表现不一致的问题。
  • 你的代码中调用createBucket方法时没有显式传入Bucket参数,安卓端SDK检测到请求参数缺失就会抛出MissingRequiredParameter: Missing required key 'Bucket' in params错误。
解决方法

方案1(最优,推荐):移除不必要的createBucket调用

如果你的S3存储桶assets已经提前创建完成,不需要每次上传前动态创建,直接删除外层的createBucket逻辑,直接执行上传即可,避免多余请求和参数兼容问题:

// 直接构造上传参数调用upload
const params = {
  Bucket: 'assets',
  Key: file.name,
  Body: base64Data,
  ACL: 'public-read',
  ContentEncoding: 'base64',
  ContentType: contentType,
};

s3bucket.upload(params, (err, data) => {
  // 原有上传回调逻辑
  console.log(err, data);
  if (err) {
    alert('很抱歉出现问题,请重试!');
  }
  if (currentIndex === -1) {
    const newDocument = {
      path: data.Location,
      page: allDocumentPages.length + 1,
      status: '',
      id_type: allDocumentPages[0].id_type,
    };
    setAllDocumentPages([...allDocumentPages, newDocument]);
  } else {
    const documentToUpdate = allDocumentPages[currentIndex];
    documentToUpdate.path = data.Location;
    documentToUpdate.status = '';
  }
  setLoadingIndex(null);
});

方案2:保留createBucket逻辑,补全参数

如果确实需要动态创建存储桶,给createBucket方法显式传入Bucket参数:

s3bucket.createBucket({ Bucket: 'assets' }, e => {
  const params = {
    Bucket: 'assets',
    Key: file.name,
    Body: base64Data,
    ACL: 'public-read',
    ContentEncoding: 'base64',
    ContentType: contentType,
  };
  // 原有upload逻辑
  s3bucket.upload(params, (err, data) => {
    // 原有上传回调逻辑
  });
})

额外兼容优化

为了彻底避免双端参数继承逻辑差异,建议调整S3初始化配置,移除全局Bucket参数,所有请求都显式传入Bucket字段:

export const s3bucket = new S3({
  accessKeyId: S3_ACCESS_KEY,
  secretAccessKey: S3_SECRET_KEY,
  signatureVersion: 'v4',
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.18 21:36:07