Как мне загрузить клиентский файл для просмотра в Amazon S3?
Позвольте мне начать с того, что я обычно очень неохотно отвечаю на эти вопросы, поскольку я всегда чувствую, чтоs ответ на все где-то в Интернете. Потратив бесчисленные часы в поисках ответа на этот вопрос, янаконец, мы отказались от этого утверждения, однако.
предположениеЭто работает:
s3.getSignedUrl('putObject', params);
Что я пытаюсь сделать?Загрузите файл через PUT (со стороны клиента) в Amazon S3, используя метод getSignedUrlРазрешить кому-либо просматривать файл, который был загружен на S3Замечания: Если там'Это более простой способ разрешить загрузку на стороне клиента (iPhone) в Amazon S3 с предварительно подписанными URL-адресами (и без предоставления учетных данных на стороне клиента). I 'м все уши.
Основные проблемы *При просмотре Консоли управления AWS загруженный файл имеет пустой набор прав доступа и метаданных.При просмотре загруженного файла (то есть, дважды щелкнув файл в Консоли управления AWS), я получаюAccessDenied
ошибка.Что я пробовал?Попробуйте № 1: мой оригинальный кодВ NodeJS я генерирую предварительно подписанный URL-адрес примерно так:
var params = {Bucket: mybucket, Key: "test.jpg", Expires: 600};
s3.getSignedUrl('putObject', params, function (err, url){
console.log(url); // this is the pre-signed URL
});
Предварительно подписанный URL выглядит примерно так:
https://mybucket.s3.amazonaws.com/test.jpg?AWSAccessKeyId=AABFBIAWAEAUKAYGAFAA&Expires=1391069292&Signature=u%2BrqUtt3t6BfKHAlbXcZcTJIOWQ%3D
Теперь я загружаю файл через PUT
curl -v -T myimage.jpg https://mybucket.s3.amazonaws.com/test.jpg?AWSAccessKeyId=AABFBIAWAEAUKAYGAFAA&Expires=1391069292&Signature=u%2BrqUtt3t6BfKHAlbXcZcTJIOWQ%3D
ПРОБЛЕМА
Я получаю* Основные проблемы вышеперечисленное
Мы также попытались добавить Content-Type и x-amz-acl в мой код, заменив параметры следующим образом:
var params = {Bucket: mybucket, Key: "test.jpg", Expires: 600, ACL: "public-read-write", ContentType: "image/jpeg"};
Тогда я попробую хороший старый ПОЛОЖИЛ:
curl -v -H "image/jpeg" -T myimage.jpg https://mybucket.s3.amazonaws.com/test.jpg?AWSAccessKeyId=AABFBIAWAEAUKAYGAFAA&Content-Type=image%2Fjpeg&Expires=1391068501&Signature=0yF%2BmzDhyU3g2hr%2BfIcVSnE22rY%3D&x-amz-acl=public-read-write
ПРОБЛЕМА
Мой терминал выводит некоторые ошибки:
-bash: Content-Type=image%2Fjpeg: command not found
-bash: x-amz-acl=public-read-write: command not found
И я также получаю* Основные проблемы вышеперечисленное.
Попробуйте №3: изменение разрешения Bucket, чтобы быть публичнымВсе перечисленные ниже элементы отмечены галочкой в Консоли управления AWS)
Grantee: Everyone can [List, Upload/Delete, View Permissions, Edit Permissions]
Grantee: Authenticated Users can [List, Upload/Delete, View Permissions, Edit Permissions]
Bucket Policy{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt1390381397000",
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": "s3:*",
"Resource": "arn:aws:s3:::mybucket/*"
}
]
}
Попробуйте №4: настройка разрешений IAMЯ установил политику пользователя так:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "s3:*",
"Resource": "*"
}
]
}
Групповая политика AuthenticatedUsers должна быть такой:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt1391063032000",
"Effect": "Allow",
"Action": [
"s3:*"
],
"Resource": [
"*"
]
}
]
}
Попробуйте №5: настройка политики CORSЯ установил политику CORS для этого:
*
PUT
POST
DELETE
GET
3000
*
И ... Теперь ям здесь.