Post 到 public S3 存储桶下的文件夹
Post to folder under a public S3 Bucket
我可以通过客户端 javascript 中的 AJAX 代码从我的浏览器成功 post 一个文件对象到 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);
}
});
}
目标是全局仅测试的临时(!)public S3 存储桶配置如下:
我的问题是我无法 post 到此存储桶根目录下的任何文件夹。具体来说,这样做...
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)
returns 来自 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>
因为只有 post 到子文件夹是问题所在,我假设我的代码是正确的并且我的文件夹配置错误。我错过了什么?克服这个问题后,我的意图是继续采用更传统的预签名 URL 方法,但仍然希望首先对存储桶权限进行排序。
fd.append('key', fileObj.name);
对象键是您指定文件的完整路径,没有前导斜杠。唯一需要不同的是这一行:
fd.append('key', 'sounds/' + fileObj.name);
我可以通过客户端 javascript 中的 AJAX 代码从我的浏览器成功 post 一个文件对象到 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);
}
});
}
目标是全局仅测试的临时(!)public S3 存储桶配置如下:
我的问题是我无法 post 到此存储桶根目录下的任何文件夹。具体来说,这样做...
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)
returns 来自 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>
因为只有 post 到子文件夹是问题所在,我假设我的代码是正确的并且我的文件夹配置错误。我错过了什么?克服这个问题后,我的意图是继续采用更传统的预签名 URL 方法,但仍然希望首先对存储桶权限进行排序。
fd.append('key', fileObj.name);
对象键是您指定文件的完整路径,没有前导斜杠。唯一需要不同的是这一行:
fd.append('key', 'sounds/' + fileObj.name);