Трудно сказать, что из этого получается, ничего не выпрыгивает ... хотя из моего опыта проблема заключалась в том, что signurl совпадает с тем, что получает S3.
В верхней части головы может быть одно или несколько из следующих значений:
- тип содержимого должен соответствовать типу загружаемого файла, например, image / jpeg
- дополнительные параметры, которые не разрешены (ACL или CacheControl заставили меня ненадолго)
- иногда браузер мешает с локальным хостом или заголовками безопасности браузера в вашем приложении
Вот как устроено мое рабочее решение ...
Извлечение из лямбды, которое создает URL:
var bodyJson = JSON.parse(event.body);
var params = {
Bucket: process.env.BUCKET,
Key: 'path/to/file/' + bodyJson.filename,
Expires: 60,
ContentType: bodyJson.filetype
};
var s3 = new aws.S3();
s3.getSignedUrl('putObject', params, function (err, url) { ... });
Я использую ng-загрузка файла в AngularJS, но я понимаю, что это стандартный http-запрос:
Upload.http({
method: 'PUT',
url: signedUrl,
headers : {
'Content-Type': fileToUpload.type
},
data: fileToUpload
}
Конфигурация S3 CORS:
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>https://*.mydomain.com</AllowedOrigin>
<AllowedMethod>PUT</AllowedMethod>
<AllowedMethod>GET</AllowedMethod>
<AllowedMethod>POST</AllowedMethod>
<AllowedMethod>HEAD</AllowedMethod>
<AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>
Надеюсь, это поможет вам или кому-то еще в будущем.