Опубликовать в папку под общедоступным S3 Bucket - PullRequest
0 голосов
/ 18 ноября 2018

Я могу успешно опубликовать объект файла через AJAX в коде JavaScript клиента из моего браузера в ROOT s3bucket, используя этот код:

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 голосов
/ 18 ноября 2018
 fd.append('key', fileObj.name);

Ключ объекта - это то, где вы указываете полный путь к файлу без косой черты. Единственное, что должно отличаться - это строка:

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