当使用预先签名的POST url将文件上传到AWS S3时,设置随机文件名
Set random file name when upload file to AWS S3 with pre-signed POST url
我使用带有jQuery文件上传的签名POST url将图像直接上传到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});
});
});
相关文章:
- 如何在Javascript/ES6中的Aurelia浏览器应用程序中使用AWS S3
- 如何使用JS检查AWS S3上是否存在动态创建的文件
- 如何在aws S3 javascript SDK中配置interval和max_attempts
- AWS S3 JavaScript 开发工具包 getSignedUrl 仅返回基本路径
- 浏览器中出现AWS S3 Javascript错误
- 使用AWS SDK for JavaScript访问AWS S3
- 当使用预先签名的POST url将文件上传到AWS S3时,设置随机文件名
- 如何使用 Node/Angular/JavaScript 将多个图像上传到 Amazon AWS S3 存储桶
- 节点.js将 imagemagick 的输出上传到 AWS S3
- 如何使用 JavaScript 删除 AWS S3 上的对象
- 如何使用 AWS S3 预签名帖子指定带扩展名的文件名
- 流星:显示来自 aws s3 的图像
- AWS S3 ajax PUT 返回“我们计算的请求签名与您提供的签名不匹配”
- 如何中止/停止正在进行的Amazon AWS s3上传
- ExpressJS从AWS S3上传和显示图像
- 下载时重命名文件,但不适用于AWS S3
- 使用nodejs-AWS-sdk将生成的pdf上传到AWS S3
- 使用浏览器JavaScript SDK检查AWS S3上是否存在文件
- 可以't在nodejs中下载AWS S3文件
- 从AWS S3加载图像时获取响应头