[英]Set random file name when upload file to AWS S3 with pre-signed POST url
我將簽名的POST網址與jQuery-file-upload結合使用,以將圖像直接上傳到AWS S3。
它在我的電腦上工作正常,但是當我用iPhone測試時,我很清楚iOS會上傳任何名稱相同的圖片,如image.png
或image.jpeg
。
這使得圖像上傳完成最后替換之前成功的任何圖像上傳。
我在Python3中使用boto3生成了預先簽名的帖子,如下所示:
post = s3.generate_presigned_post(
Bucket='?????????',
Key=get_random_string(8,'simple') + '/${filename}',
Fields={
'success_action_status': '201',
'acl': 'public-read'
},
Conditions=[{
'success_action_status': '201'
},
{
'acl': 'public-read'
},
["starts-with", "$Content-Type", ""]
]
)
post['fields'] = json.dumps(post['fields'])
這是我的javascript代碼:
$(function () {
'use strict';
var form = $('#fileupload');
// Initialize the jQuery File Upload widget:
$('#fileupload').fileupload({
dropZone: $('#dropzone'),
previewMaxHeight: 300,
previewMaxWidth: 300,
acceptFileTypes: /(\.|\/)(gif|jpe?g|png)$/i,
dataType: 'XML',
getFilesFromResponse: function (data) {
var key = $(data.jqXHR.responseXML).find("Key").text();
var url = $(data.jqXHR.responseXML).find("Location").text();
return [{
url: url,
name: key,
thumbnailUrl: url,
}];
},
}).on('fileuploadsubmit', function (e, data) {
data.formData = (function (form) {
var r = form.serializeArray();
$.each(form.data('theform-data'), function(k, v) {
r.push({name: k , value: v})
});
return r;
})(data.form);
data.formData.push({name: "Content-Type" , value: data.files[0].type});
});
});
Python中的get_random_string(8,'simple')
只能在不同的上傳中阻止相同的文件名,但是當用戶同時上傳多文件時(因為它們使用相同的預簽名POST URL進行上傳),它不能阻止相同的文件名。
因此,我想知道在使用預簽名的POST URL將文件上傳到AWS S3時,是否可以設置隨機文件名?
我發現這可行:
$(function () {
'use strict';
var form = $('#fileupload');
// Initialize the jQuery File Upload widget:
$('#fileupload').fileupload({
dropZone: $('#dropzone'),
previewMaxHeight: 300,
previewMaxWidth: 300,
acceptFileTypes: /(\.|\/)(gif|jpe?g|png)$/i,
dataType: 'XML',
getFilesFromResponse: function (data) {
var key = $(data.jqXHR.responseXML).find("Key").text();
var url = $(data.jqXHR.responseXML).find("Location").text();
return [{
url: url,
name: key,
thumbnailUrl: url,
}];
},
}).on('fileuploadsubmit', function (e, data) {
data.formData = (function (form) {
var r = form.serializeArray();
$.each(form.data('theform-data'), function(k, v) {
if (k == "key") {
var filename = v.split("/");
var random_prefix = filename[0];
var ext = data.files[0].name.split(".").slice(-1)[0];
v = random_prefix + '/'
+ (function (length, chars) {
var result = '';
for (var i = length; i > 0; --i) result += chars[Math.floor(Math.random() * chars.length)];
return result;
})(10, '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ')
+ '.' + ext.toLowerCase();
};
r.push({name: k , value: v})
});
return r;
})(data.form);
data.formData.push({name: "Content-Type" , value: data.files[0].type});
});
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.