需求
- 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)
网友评论