美文网首页
App直传图片到AWS S3对象存储

App直传图片到AWS S3对象存储

作者: 深圳都这么冷 | 来源:发表于2022-04-27 15:40 被阅读0次

需求

  • 1 客户端可以直接上传图片
  • 2.内部的对象可以公开读(只限对象,不能搜索文件夹)
  • 3.写和搜索只能credential授权
  • 4.需要配置CDN访问地址前缀TODO

设置

  • 第一步,新建桶
  • 第二步,设置桶「访问控制列表(ACL)」

所有人(公有访问权限) 「读取那一项」

  • 第三步,在桶「权限」设置「跨源资源共享(CORS)」


    CORS设置
  • 第四步,上传文件时

设置「预定义ACL」的「授予公开读取访问权限」

配置相关资料

  • 1.bucket:xxx
  • 2.region:eu-central-1
  • 3.accessKeyId:xxx
  • 4.secretAccessKey:xxx

注:js版demo

<!DOCTYPE html>
<html>
<head>
    <title>AWS S3 File Upload</title>
    <script src="https://sdk.amazonaws.com/js/aws-sdk-2.235.1.min.js"></script>
</head>

<body>
<input id="file-chooser" type="file"/>
<button id="upload-button">Upload</button>
<p id="results"></p>
<script type="text/javascript">

  var credential = {
    accessKeyId: 'xxx',
    secretAccessKey: 'xxx'
  };

  AWS.config.update(credential);
  AWS.config.region = 'eu-central-1'; //设置区域

  var bucket = new AWS.S3({params: {Bucket: 'xxx'}});  //设置桶


  var fileChooser = document.getElementById('file-chooser');
  var button = document.getElementById('upload-button');
  var results = document.getElementById('results');
  button.addEventListener('click', function () {
  var file = fileChooser.files[0];

  if (file) {
    results.innerHTML = 'Waiting';
    var params = {
        Key: file.name,
        ContentType: file.type,
        Body: file,
        'Access-Control-Allow-Credentials': '*',
        ACL: 'public-read'
    };
    bucket.upload(params, function (err, data) {
        if (err) {
            results.innerHTML = 'ERROR :(';
        }else{
            results.innerHTML = 'UPLOADED :)';
        }
    });
  } else {
    results.innerHTML = 'Nothing to upload.';
  }
  }, false);
  </script>
</body>
</html>

注:python版demo

import os
import boto3
import traceback
import mimetypes
from consts import AWS_S3_CFG


class S3M(object):
    def __init__(self,
                 bucket_name=AWS_S3_CFG['bucket_name'],
                 region_name=AWS_S3_CFG['region_name'],
                 access_key_id=AWS_S3_CFG['access_key_id'],
                 secret_access_key=AWS_S3_CFG['secret_access_key'],
                 path_prefix=AWS_S3_CFG['path_prefix']):
        self.bucket_name = bucket_name
        self.region_name = region_name
        self.access_key_id = access_key_id
        self.secret_access_key = secret_access_key
        self.prefix = path_prefix

        self.client = boto3.client(
            service_name='s3',
            aws_access_key_id=self.access_key_id,
            aws_secret_access_key=self.secret_access_key,
            region_name=self.region_name
        )

    def s3_upload_file(self, local_path, key):
        ctt_type = mimetypes.guess_type(local_path)[0]
        try:

            self.client.upload_file(local_path, self.bucket_name, key,
                                    ExtraArgs={
                                        'ACL': 'public-read',
                                        'ContentType': ctt_type,
                                    })
        except Exception as e:
            print(traceback.format_exc())
        return os.path.join(self.prefix, key)

    def s3_download_file(self, key, save_dir):
        save_path = os.path.join(save_dir, os.path.basename(key))
        try:
            self.client.download_file(self.bucket_name, key, save_path)
        except Exception as e:
            print(traceback.format_exc())
        return save_path


if __name__ == '__main__':
    s3 = S3M()
    # ans = s3.s3_download_file('timg.jpeg', '/Users/fromdtor/Downloads')
    ans = s3.s3_upload_file('/Users/fromdtor/Downloads/timg-timg.jpeg', 'timg-timg-0.jpeg')
    print(ans)

相关文章

网友评论

      本文标题:App直传图片到AWS S3对象存储

      本文链接:https://www.haomeiwen.com/subject/mqhlyrtx.html