【问题标题】:How to use react-s3-uploader with reactjs?如何将 react-s3-uploader 与 reactjs 一起使用?
【发布时间】:2018-06-25 06:52:05
【问题描述】:

我是 reactjs 的新手,想在 s3 上上传图片,但不知道它是如何工作的......而且不知道我从哪里获得图片路径来自 aws(在哪个函数中)?

这是我的反应代码

import ApiClient from './ApiClient';  // where it comes from?

function getSignedUrl(file, callback) {
  const client = new ApiClient();
  const params = {
    objectName: file.name,
    contentType: file.type
  };

  client.get('/my/signing/server', { params })   // what's that url?
  .then(data => {
    callback(data); // what should I get in callback?
  })
  .catch(error => {
    console.error(error);
  });
}

我的服务器文件Server.js

AWS.config.setPromisesDependency(Bluebird)

AWS.config.update({
  accessKeyId: 'accessKey',
  secretAccessKey: 'secret',
  region: 'ap-south-1'
})

const s3 = new AWS.S3({
  params: {
    Bucket: 'Bucketname'
  },
  signatureVersion: 'v4'
})

class S3Service {

  static getPreSignedUrl(filename, fileType, acl = 'public-read') {
    return new Bluebird(resolve => {
      const signedUrlExpireSeconds = 30000
      return resolve({
          signedRequest : s3.getSignedUrl('putObject', {
            Key: "wehab/"+filename,
            ContentType:"multipart/form-data",
            Bucket: config.get('/aws/bucket'),
            Expires: signedUrlExpireSeconds
          }),
          url : `https://${config.get('/aws/bucket')}.s3.amezonaws.com/wehab/${filename}`
        })
    })
  }

}

【问题讨论】:

    标签: javascript reactjs react-dropzone


    【解决方案1】:

    首先您需要创建 s3 存储桶并附加这些策略 如果存储桶名称为 'DROPZONEBUCKET'(存储桶是全局唯一的)

    政策

    {
       "Version": "2012-10-17",
       "Statement": [
           {
               "Sid": "PublicReadGetObject",
               "Effect": "Allow",
               "Principal": "*",
               "Action": [
                   "s3:PutObject",
                   "s3:GetObject"
               ],
               "Resource": "arn:aws:s3:::DROPZONEBUCKET/*"
           }
       ]
    }
    

    CORS 配置

    <?xml version="1.0" encoding="UTF-8"?>
    <CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
    <CORSRule>
       <AllowedOrigin>*</AllowedOrigin>
       <AllowedMethod>GET</AllowedMethod>
       <AllowedMethod>PUT</AllowedMethod>
       <MaxAgeSeconds>9000</MaxAgeSeconds>
       <AllowedHeader>*</AllowedHeader>
    </CORSRule>
    </CORSConfiguration>
    

    然后运行您的 node.js 服务器并尝试上传文件。

    一旦你选择上传文件,它会调用这个getSignedUrl(file, callback)函数并返回url。

    成功获取此 URL 后,您可以上传文件。

    那么文件路径就是 https://s3.amazonaws.com/{BUCKET_NAME}/{FILE_NAME}

    例如。

    https://s3.amazonaws.com/DROPZONEBUCKET/profile.jpeg
    

    像这样修改 API

    var s3Bucket = new AWS.S3();
    
    var s3 = new Router({ mergeParams: true });
    
    var params = {
        Bucket: 'BUCKET_NAME', // add your s3 bucket name here
        Key: data.filename,
        Expires: 60,
        ContentType: data.filetype
      };
    
      s3Bucket.getSignedUrl('putObject', params, function (err, data) {
      if (err) console.log(err, err.stack); // an error occurred
      else     console.log(data);           // successful response
    });
    

    【讨论】:

    • 我应该将 PolicyCORS config 的代码保存在哪里?前端还是后端??这段代码如何在ReactS3Uploader中使用?
    • 您必须在 aws 控制台(AWS 控制台 -> S3-> 创建的存储桶 -> 权限选项卡)上保留策略和 CORS 配置,然后您才能看到存储桶策略和 cors 配置
    • 您有 AWS 控制台访问权限吗?请登录并转到 s3 部分并选择已创建的 s3 存储桶,然后您可以添加这些配置
    • 感谢您的帮助,但仍然出现跨域错误。并在 aws 控制台中添加了配置
    • 这两个配置你加了吗?
    猜你喜欢
    • 2021-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 2015-12-26
    • 2016-12-03
    • 2017-08-06
    相关资源
    最近更新 更多