发布到公共S3存储桶下的文件夹

时间:2018-11-17 21:16:26

标签: amazon-s3 permissions acl

我可以使用以下代码通过AJAX将客户端javascript代码中的文件对象从我的浏览器成功发布到s3bucket的 ROOT

function upload_file(path, fileObj) {
 var fd = new FormData();
 fd.append('key', fileObj.name);
 fd.append('acl', 'bucket-owner-full-control');
 fd.append('Content-Type', fileObj.type);
 fd.append("file",fileObj);

 return $.ajax({
    type : 'POST',
    url : path,
    data : fd,
    processData: false,  // Don't process the data
    contentType: false,  // Don't set contentType
    success: function(json) { console.log('Upload complete!') },
    error: function (XMLHttpRequest, textStatus, errorThrown) {
        console.log('Upload error: ' + XMLHttpRequest.responseText);
    }
 });
}

目标是仅测试的临时(!)全局公共S3存储桶,其配置如下:

public settings

acl

bucket policy

cors

我的问题是我无法发布到此存储桶根目录下的任何文件夹。具体来说,就是这样做...

upload_file('https://s3-us-west-2.amazonaws.com/bucket.example.com/', fileObj)

成功上传到根存储桶。

但是这样做...

upload_file('https://s3-us-west-2.amazonaws.com/bucket.example.com/sounds/', fileObj)

从S3返回此错误:

Upload error: 
<?xml version="1.0" encoding="UTF-8"?>
<Error>
<Code>MethodNotAllowed</Code>
<Message>The specified method is not allowed against this resource.</Message>
<Method>POST</Method> 
<ResourceType>OBJECT</ResourceType> 
<RequestId>DC6AA872FC4F96B4</RequestId>
<HostId>/AOtAuVcXnRZrQD7Rs+EmpZ2H5YDs5TPgEjmvMpVqSdZuPbnTtE/nh4p/Fgad8v00VQ93RKer8g=</HostId>
</Error>

由于仅将问题发布到子文件夹,所以我认为我的代码是正确的,并且我配置了我的文件夹。我想念什么?解决此问题后,我的目的是继续使用更传统的预签名URL方法,但仍希望首先对存储桶权限进行排序。

1 个答案:

答案 0 :(得分:2)

 fd.append('key', fileObj.name);

对象键是您指定文件的完整路径而没有斜杠。唯一需要不同的是此行:

fd.append('key', 'sounds/' + fileObj.name);