Загрузка в AWS S3 с помощью createPresignedPost - файл невидим в S3 или условие политики не выполнено - PullRequest
0 голосов
/ 30 марта 2019

Попытка загрузки в 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-форме (закомментировано сейчас), я получил ошибку «отказано в доступе».у это что?

Перепробовал много других комбинаций, таких как старт-с-условием.Безрезультатно.

Большое спасибо за поиск!Боролся весь день.

1 Ответ

0 голосов
/ 30 марта 2019

Я нашел это! Нужно убрать ключ в полях: https://stackoverflow.com/questions/51757774/aws-s3-policy-condition-failed-eq-key/51888040

...