AWS Lambda getSignedUrl не создает загружаемую ссылку для файлов .txt, но работает для .docx - PullRequest
0 голосов
/ 03 июня 2019

Я пытаюсь создать подписанный URL-адрес для загрузки файла из корзины AWS S3. Моей лямбда-функции Node.JS я передаю ей имя файла, и он создаст подписанный URL-адрес, который я затем запускаю на стороне клиента для загрузки файла. Это хорошо работает для файлов .docx, но не работает для .txt. Вместо этого, подписанный, предоставленный при нажатии, открывает файл в браузере / консоли. Нужно ли что-то делать по-другому при создании подписанного URL для работы с файлами .txt?

Я попытался устранить проблему и считаю, что это разница в типах файлов. Первоначально я думал, что это может быть связано с именами файлов и управляющими символами, влияющими на него, но я переименовал файл .txt и удалил его из любых специальных символов, и он все еще не работает. Проблема также не вызвана различиями в размерах файлов, так как я создал два идентичных файла (один .docx и другой .txt) и файл .docx, загруженный, как и ожидалось. Файл .txt не будет.

Вот код, который я использую для загрузки файлов из корзины S3

//creates signed url that is returned to client side
const url = s3.getSignedUrl('getObject', {
        Bucket: myBucket,
        Key: myPassedInKey,
        Expires: signedUrlExpireSeconds
        });

        responseBody = {
            success: true,
            url: url
        };
//give the signed url and it will download it
function download(url) {
    $('<iframe>', { id: 'idown', src: url }).hide().appendTo('body').click();
}

Я ожидаю, что файл загрузит файл в папку загрузки, но это не так. При отладке, если вы вводите подписанный URL в браузер, он просто открывает файл на странице браузера, а не загружает, как это происходит с файлами .docx

EDIT

Я считаю, что мой вопрос отличается от предложения ниже. Я ищу, чтобы выяснить, почему создание подписанного URL-адреса работает, как ожидается, для файла .docx, а не для .txt.

Ответы [ 2 ]

0 голосов
/ 04 июня 2019

Спасибо @DevenA и @stdunbar за помощь в решении проблемы, с которой я столкнулся. Они оба были правы в том, что добавили заголовок «Content Disposition» для принудительной загрузки вместо того, чтобы открывать его в браузере. Ниже приведено изменение, которое я внес в код, генерирующий подписанный URL.

var contentDisposition = 'attachment; filename=\"' + myPassedInKey + '\"';
const url = s3.getSignedUrl('getObject', {
Bucket: myBucket,
Key: myPassedInKey,
ResponseContentDisposition: contentDisposition,
Expires: signedUrlExpireSeconds
});

Код выше теперь загружает .txt по желанию

0 голосов
/ 03 июня 2019

Я предполагаю, что проблема в том, что большинство браузеров будут пытаться отображать txt в самом браузере, в то время как у них, как правило, нет обработчика для docx, поэтому они автоматически по умолчанию предлагают пользователю загрузить файл.

Возможно, вам потребуется добавить заголовок «расположение содержимого» и / или добавить

style: «visibility: hidden; display: none»

в конструкции iframe.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...