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

2022-04-27  本文已影响0人  深圳都这么冷

需求

设置

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

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

配置相关资料

注: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)

上一篇 下一篇

猜你喜欢

热点阅读