【问题标题】:Set random file name when upload file to AWS S3 with pre-signed POST url使用预签名的 POST url 将文件上传到 AWS S3 时设置随机文件名
【发布时间】:2016-03-26 16:27:57
【问题描述】:

我使用带有 jQ​​uery-file-upload 的签名 POST url 将图像直接上传到 AWS S3。

它在我的 PC 上运行良好,但是当我使用 iPhone 进行测试时,我发现 iOS 会上传任何具有相同名称的图片,例如 image.pngimage.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 时,是否有任何方法可以设置随机文件名?

【问题讨论】:

    标签: javascript python file amazon-s3 jquery-file-upload


    【解决方案1】:

    我发现这行得通:

    $(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});
        });
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-23
      • 1970-01-01
      • 1970-01-01
      • 2020-09-30
      • 2019-08-05
      • 1970-01-01
      • 1970-01-01
      • 2015-11-29
      相关资源
      最近更新 更多