Попытка загрузки в AWS S3 с использованием подхода createPresignedPost, но, казалось бы, загруженный файл невидим или не отображается в корзине S3, или возвращается сообщение об ошибке «Условие политики не выполнено».
Необходимость загрузки файлов в корзину AWS S3безопасно, поэтому я пытаюсь создать предопределенную почтовую политику в Lambda.Затем я копирую детали политики в тестовую HTML-форму, затем загружаю файлы.Если я введу параметр «key», например, такой: <input type="input" name="key" value="datafile/math3/${filename}" />
, появится сообщение об ошибке «Условие политики не выполнено».Зачем?Кажется, это правильный способ установить этот параметр.Но если я установлю «ключ» следующим образом (удалите часть {имя_файла}), <input type="input" name="key" value="datafile/math3/" />
, загрузка будет выполнена успешно. Ошибка не возвращается, я даже вижу, что папка «datafile / math3» создана в S3.в папке нет файла. Если я проверяю размер папки, размер примерно соответствует файлу, который я пытаюсь загрузить. Объект не отображается. Почему?
Лямбда-код:
var policy;
var AWS = require('aws-sdk');
AWS.config.update({accessKeyId: 'xxxxxxxxxxx', secretAccessKey: 'yyyyyyyyyyyyyyyyyyyyyyy'});
const s3 = new AWS.S3();
const key = 'datafile/math3/';
const params = {
Bucket: 'my-file-store',
Key: key,
Expires: 60*60, // in seconds,
Fields: {
key: key,
}
// Conditions: [
// // {'acl': 'public-read'},
// // ["starts-with", "$key", "datafile/math3/"],
// // {'key': 'datafile/math3/'}
// ]
};
s3.createPresignedPost(params, function(err, data) {
if (err) {
throw err;
}
else {
policy = data;
}
});
return policy;
Я запускаю этот лямбда-код в тестовом режиме и копирую необходимую информацию в html-код.
HTML-код:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<form action="https://s3.amazonaws.com/my-file-store" method="post" enctype="multipart/form-data">
Key to upload:
<input type="input" name="key" value="datafile/math3/${filename}" /><br />
<!-- <input type="input" name="key" value="datafile/math3/" /><br /> -->
<!-- <input type="hidden" name="acl" value="public-read" /> -->
<!-- <input type="hidden" name="success_action_redirect" value="http://aztopia-file-store.s3.amazonaws.com/successful_upload.html" /> -->
Content-Type:
<!-- <input type="input" name="Content-Type" value="image/jpeg" /><br /> -->
<!-- <input type="hidden" name="x-amz-meta-uuid" value="14365123651274" /> -->
<!-- <input type="hidden" name="x-amz-server-side-encryption" value="AES256" /> -->
<input type="text" name="X-Amz-Credential" value="erzdfgsdfgsddgdffdfffxxxxxx/20190330/us-east-1/s3/aws4_request" />
<input type="text" name="X-Amz-Algorithm" value="AWS4-HMAC-SHA256" />
<input type="text" name="X-Amz-Date" value="20190330T030853Z" />
Tags for File:
<!-- <input type="input" name="x-amz-meta-tag" value="" /><br /> -->
<input type="hidden" name="Policy" value='asdfasfadsfasdfasdfasrheghjfghjfhhjfgjghxxxxxxxxxxxxxxxxxxxxxxxxxxxx==' />
<input type="hidden" name="X-Amz-Signature" value="343rgwgdhgsfgsdfgdgdfgsdfgsdfgsdfgfdyyyyyyyy" />
File:
<input type="file" name="file" /> <br />
<!-- The elements after this will be ignored -->
<input type="submit" name="submit" value="Upload to Amazon S3" />
</form>
</html>
Кстати, у меня есть настройка CORS в корзинекак показано ниже.
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>*</AllowedOrigin>
<AllowedMethod>POST</AllowedMethod>
<AllowedMethod>GET</AllowedMethod>
<AllowedMethod>PUT</AllowedMethod>
<AllowedMethod>DELETE</AllowedMethod>
<AllowedMethod>HEAD</AllowedMethod>
<AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>
Теперь, почему мне не нравится устанавливать ключ следующим образом: <input type="input" name="key" value="datafile/math3/${filename}" />
? Из всех источников часть {имя_файла} представляется необходимой.
Если я удалю$ {имя_файла}, я знаю, что он не может правильно разместить объект, так как он не знает имя файла.
Что мне здесь не хватает?
Еще один, возможно связанный вопрос: если я добавлю <input type="hidden" name="acl" value="public-read" />
параметр как в лямбда-выражении, так и в html-форме (закомментировано сейчас), я получил ошибку «отказано в доступе».у это что?
Перепробовал много других комбинаций, таких как старт-с-условием.Безрезультатно.
Большое спасибо за поиск!Боролся весь день.