在 react-native 中将图像上传到亚马逊 s3

Posted

技术标签:

【中文标题】在 react-native 中将图像上传到亚马逊 s3【英文标题】:upload an image to amazon s3 in react-native 【发布时间】:2016-03-08 13:16:27 【问题描述】:

我正在尝试将图像上传到亚马逊 s3,如果可能的话,任何人都可以提供如何上传到亚马逊 s3 的链接/文档,非常感谢任何帮助

【问题讨论】:

将您的问题分解为更小的部分并逐一解决。 1) 在 react-native 中建立网络。 2) 在 react-native 网络框架中上传文件。 3) 亚马逊 S3 API。另外,我不确定这个问题是否适合 SO。 您能分享一下您最终使用的解决方案吗? 【参考方案1】:

S3 选项:

    // this.state.s3options in YourComponent
    
      "url": "https://yourapp.s3.eu-central-1.amazonaws.com",
      "fields": 
        "key": "cache/22d65141b48c5c44eaf93a0f6b0abc30.jpeg",
        "policy": "eyJleHBpcm...1VDE0Mzc1OVoifV19",
        "x-amz-credential": "AK...25/eu-central-1/s3/aws4_request",
        "x-amz-algorithm": "AWS4-HMAC-SHA256",
        "x-amz-date": "20161125T143759Z",
        "x-amz-signature": "87863c360...b9b304bfe650"
      
    

组件:

    class YourComponent extends Component 
      // ...
    
      // fileSource looks like: uri: "content://media/external/images/media/13", isStatic: true
      async uploadFileToS3(fileSource) 
        try 
          var formData = new FormData();
          // Prepare the formData by the S3 options
          Object.keys(this.state.s3options.fields).forEach((key) => 
            formData.append(key, this.state.s3options.fields[key]);
          );
          formData.append('file', 
            uri: fileSource.uri,
            type: 'image/jpeg',
          );
          formData.append('Content-Type', 'image/jpeg')
    
          var request = new XMLHttpRequest();
          request.onload = function(e) 
            if (e.target.status === 204) 
              // Result in e.target.responseHeaders.Location
              this.setState(avatarSourceRemote: uri: e.target.responseHeaders.Location)
            
          .bind(this)
          request.open('POST', this.state.s3options.url, true);
          request.setRequestHeader('Content-type', 'multipart/form-data');
          request.send(formData);
         catch(error) 
          console.error(error);
        
      
    
      // Example display the uploaded image
      render() 
        if (this.state.avatarSourceRemote) 
          return (
            <Image source=this.state.avatarSourceRemote style=width: 100, height: 100 />
          );
         else 
          return (
            <Text>No Image</Text>
          );
        
      
    

【讨论】:

【参考方案2】:

这对我有用

import fs from 'react-native-fs';
import decode from 'base64-arraybuffer';
import AWS from 'aws-sdk';

export const uploadFileToS3 = async (file) => 

  const BUCKET_NAME = 'XXXXXXXXXX';
  const IAM_USER_KEY = 'XXXXXXXXXX';
  const IAM_USER_SECRET = 'XXXXXXXXXXXXXXX';

  const s3bucket = new AWS.S3(
    accessKeyId: IAM_USER_KEY,
    secretAccessKey: IAM_USER_SECRET,
    Bucket: BUCKET_NAME,
    signatureVersion: 'v4',
  );

  const contentType = file.type;
  const contentDeposition = `inline;filename="$file.name"`;
  const fPath = file.uri;
  const base64 = await fs.readFile(fPath, 'base64');
  const arrayBuffer = decode(base64);

  return new Promise((resolve, reject) => 
    s3bucket.createBucket(() => 
      const params = 
        Bucket: BUCKET_NAME,
        Key: file.name,
        Body: arrayBuffer,
        ContentDisposition: contentDeposition,
        ContentType: contentType,
      ;
      s3bucket.upload(params, (error, data) => 
        utils.stopLoader();
        if (error) 
          reject(getApiError(error));
         else 
          console.log(JSON.stringify(data));
          resolve(data);
        
      );
    );
  );
;

【讨论】:

以上是关于在 react-native 中将图像上传到亚马逊 s3的主要内容,如果未能解决你的问题,请参考以下文章

React-native 上传图片作为 FormData

如何使用 django-storages 将图像上传到亚马逊 S3?在管理员中上传有效,但在网站表单中无效

使用 multer-s3 nodejs 将图像上传到亚马逊 s3

在 Android 中将图像上传到 Cloudinary 失败

Firebase 存储上传图像不适用于亚马逊火灾(型号:Fire 7)

在android中将多个图像上传到服务器的最快方法