javascript - 通过使用 aws-sdk 在 s3 Bucket 上上传图像来 react native

标签 javascript reactjs amazon-web-services react-native amazon-s3

我正在使用 aws-sdk 在 s3 存储桶上上传图像。请查看下面我的代码,我已经用了一天时间。

uploadImageOnS3 = () => {

    var S3 = require("aws-sdk/clients/s3");

    const BUCKET_NAME = "testtest";
    const IAM_USER_KEY = "XXXXXXXXXXXXX";
    const IAM_USER_SECRET = "XXXXX/XXXXXXXXXXXXXXXXXXXXXX";

    const s3bucket = new S3({
      accessKeyId: IAM_USER_KEY,
      secretAccessKey: IAM_USER_SECRET,
      Bucket: BUCKET_NAME
    });
    let contentType = "image/jpeg";
    let contentDeposition = 'inline;filename="' + this.state.s3BucketObj + '"';
         let file= {
         uri: this.state.fileObj.uri,
         type: this.state.fileObj.type,
         name: this.state.fileObj.fileName

     };
    s3bucket.createBucket(() => {
      const params = {
        Bucket: BUCKET_NAME,
        Key: this.state.s3BucketObj,
        Body: file,
        ContentDisposition: contentDeposition,
        ContentType: contentType

      };
      s3bucket.upload(params, (err, data) => {
        if (err) {
          console.log("error in callback");
          console.log(err);
        }
        // console.log('success');
        console.log(data);

      });
    });
  };

错误:

Unsupported body payload object

请帮我缩短我也在使用 react-native-image-picker 上传图片。

最佳答案

您必须在主体流中使用数组缓冲区来传递数据对象。 根据 aws 文档,您可以在 body 参数中传递数据流、字符串、数组缓冲区或 blob 数据类型。

请检查下面的代码,这将解决您的问题,

import fs from "react-native-fs";
import { decode } from "base64-arraybuffer";

uploadImageOnS3 = async() => {

    var S3 = require("aws-sdk/clients/s3");

    const BUCKET_NAME = "testtest";
    const IAM_USER_KEY = "XXXXXXXXXXXXX";
    const IAM_USER_SECRET = "XXXXX/XXXXXXXXXXXXXXXXXXXXXX";

    const s3bucket = new S3({
      accessKeyId: IAM_USER_KEY,
      secretAccessKey: IAM_USER_SECRET,
      Bucket: BUCKET_NAME,
      signatureVersion: "v4"
    });
    let contentType = "image/jpeg";
    let contentDeposition = 'inline;filename="' + this.state.s3BucketObj + '"';
    const fPath = this.state.fileObj.uri;

    const base64 = await fs.readFile(fPath, "base64");
    //console.log(base64);

    const arrayBuffer = decode(base64);
    //console.log(arrayBuffer);
    s3bucket.createBucket(() => {
      const params = {
        Bucket: BUCKET_NAME,
        Key: this.state.s3BucketObj,
        Body: arrayBuffer,
        ContentDisposition: contentDeposition,
        ContentType: contentType

      };
      s3bucket.upload(params, (err, data) => {
        if (err) {
          console.log("error in callback");
          console.log(err);
        }
        // console.log('success');
        console.log(data);

      });
    });
  };

关于javascript - 通过使用 aws-sdk 在 s3 Bucket 上上传图像来 react native ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56682109/

相关文章:

python - XGBoost(免费套餐)的 Amazon Sagemaker ResourceLimitExceeded 错误

javascript - 如何找到数组A中空白项的索引并将它们插入数组B中的相同索引?

javascript - JavaScript 中的自定义事件

javascript - 无法在提示框中写入数字

javascript - 映射表数据二维数组

javascript - 针对特定子组件的 React propTypes

javascript - 如何在 google chrome 扩展程序中检测到我已登录到另一个网站?

javascript - 使用 jQuery 预激活链接

amazon-web-services - 如何仅增加 AWS EC2 上的根磁盘的大小以用于 Elastic Beanstalk?

java - 如何使用 AWS CDK for Java 为账户创建 IAM 委托(delegate)人?