javascript - 将 blob 直接上传到 s3 时出现问题

标签 javascript html amazon-s3

我有以下代码:

var fd = new FormData();

        var key = "events/" + (new Date).getTime() + '-';

        fd.append('key', key);
        fd.append('acl', Acl);
        fd.append('Content-Type', "image/jpeg");
        fd.append('AWSAccessKeyId', AWSAccessKeyId);
        fd.append('policy', Policy);
        fd.append('name', "Policy13492345");
        fd.append('success_action_status', "201");
        fd.append('signature', Signature);          
        fd.append("file",  blob);
        fd.append("filename", fileName + ".jpg");
        var xhr = new XMLHttpRequest();



        xhr.upload.addEventListener("progress", uploadProgress, false);
        xhr.addEventListener("load", uploadComplete, false);
        xhr.addEventListener("error", uploadFailed, false);
        xhr.addEventListener("abort", uploadCanceled, false);

        xhr.open('POST', 'https://s3.amazonaws.com/' + Bucket + '/', true); 

        xhr.send(fd);

当此请求通过时,我收到以下错误:

<Code>AccessDenied</Code><Message>Invalid according to Policy: Policy Condition failed: ["starts-with", "$Filename", ""]</Message>

我不知道我做错了什么,我这样生成我的 blob:

function dataURItoBlob(dataURI) {
                var binary = atob(dataURI.split(',')[1]);
                var array = [];
                for (var i = 0; i < binary.length; i++) {
                    array.push(binary.charCodeAt(i));
                }
                var mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0]
                return new Blob([new Uint8Array(array)], { type: mimeString });
            }

这是我的要求:

------WebKitFormBoundaryxh8thnHAmDhZQuXE
Content-Disposition: form-data; name="key"

events/1367541109750-
------WebKitFormBoundaryxh8thnHAmDhZQuXE
Content-Disposition: form-data; name="acl"

private
------WebKitFormBoundaryxh8thnHAmDhZQuXE
Content-Disposition: form-data; name="Content-Type"

image/jpeg
------WebKitFormBoundaryxh8thnHAmDhZQuXE
Content-Disposition: form-data; name="AWSAccessKeyId"

asdfasdfFASDFSDFAADSFHHVDQ
------WebKitFormBoundaryxh8thnHAmDhZQuXE
Content-Disposition: form-data; name="policy"

FsnY29udFuZ2UnLCAwLCAxMDAwMDAwMDBdLAogICAgICasdfasdfAgIFsgJ3N0YXJ0cy13aXRoJywgJyRrZXknLCAnJyBdLAogICAgICAgIFsgJ3N0YXJ0cy13aXRoJywgJyRDb250ZW50LVR5cGUnLCAnasdfJyBdLAo
------WebKitFormBoundaryxh8thnHAmDhZQuXE
Content-Disposition: form-data; name="name"

Policy134722343242345
------WebKitFormBoundaryxh8thnHAmDhZQuXE
Content-Disposition: form-data; name="success_action_status"

201
------WebKitFormBoundaryxh8thnHAmDhZQuXE
Content-Disposition: form-data; name="signature"

basdfasdftwa/9asdfasdfx3/zasdfadsft6g=
------WebKitFormBoundaryxh8thnHAmDhZQuXE
Content-Disposition: form-data; name="file"; filename="blob"
Content-Type: image/jpeg


------WebKitFormBoundaryxh8thnHAmDhZQuXE
Content-Disposition: form-data; name="filename"

C:\fakepath\495845894.jpg
------WebKitFormBoundaryxh8thnHAmDhZQuXE--

最佳答案

解决了问题,表单数据的排序很重要,您必须遵循正确的顺序才能正确发布数据。

关于javascript - 将 blob 直接上传到 s3 时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16349863/

相关文章:

javascript - 将 electron devtools 中的日志保存到文件中

javascript - 在 Vim 中,如何防止 HTML 标签的自动缩进,但保留 Javascript 的部分?

javascript - 在 Fabric.js 中将 Canvas 下载为 PNG,出现网络错误

javascript - 单击按钮淡出弹出窗口?

amazon-s3 - 如何引用Cloud Formation中创建的S3存储桶

javascript - 在没有 jQuery 的情况下将 div 滑入外观

jquery - 制作堆叠的响应 block ,在调整大小时改变高度和宽度

jquery - 全宽 jquery 幻灯片链接不起作用

amazon-web-services - CloudFormation KMS 加密问题

amazon-web-services - s3 - 调用 HeadObject 操作时发生错误 (403) : Forbidden