【发布时间】:2018-11-17 21:16:25
【问题描述】:
我可以通过客户端javascript代码中的AJAX成功地将文件对象从我的浏览器发布到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 存储桶,配置如下:
我的问题是我无法发布到此存储桶根目录下的任何文件夹。具体来说,这样做...
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 方法,但仍希望首先对存储桶权限进行排序。
【问题讨论】:
-
子文件夹权限一样吗?
-
我看不到如何直接授予文件夹权限,尼克,除了简单地使用默认值创建文件夹之外,还没有授予文件夹权限。但后来我确实选择了该文件夹,并通过 Actions 将其公开,只是为了更好地衡量。更改存储桶权限/cors/acls 后是否必须重新创建文件夹?
-
刚刚删除了子文件夹并使用默认值重新创建了它(它声明该文件夹从存储桶继承了相同的设置)。当我尝试发布到它时仍然得到相同的错误。再次公开。同样的错误。
-
您的 CORS 配置正确,问题中引用的错误消息与 CORS 无关。如果您遇到 CORS 问题,您会从客户端的浏览器中收到一条错误消息。但相反,您会收到服务器端错误消息。因此,问题似乎需要在 CORS 配置之外的其他地方找到解决方案。
-
我也指望这一点。但以防万一,想要提供该配置,以便其他人不会要求它。谢谢,旁观者。您是否发现其他配置有任何问题?
标签: amazon-s3 permissions acl