Когда ваше веб-приложение должно управлять большим количеством изображений, вы должны помнить о влиянии, которое оно оказывает на ваш сервер. Это не только потребует ценного локального хранилища, но и может повлиять на производительность и повлечь за собой финансовые затраты.
В проекте, ориентированном на пользователей, загружающих изображения профилей, я реализовал решение на интерфейсе React. Вот рабочий процесс:
- Загрузите загруженный файл
- Отправить имя файла и тип файла на сервер
- Получите подписанный запрос из ваших учетных данных AWS.
- Доставьте файл изображения с подписанным запросом на S3 для хранения
Импорт необходимых библиотек
import $ from 'jquery'; import axios from 'axios';
Загрузите форму отправки изображения с помощью обработчика событий:
<form onSubmit={this.handleImgUpload.bind(this)} encType="multipart/form-data"> <input type="file" onChange={this.handleFile.bind(this)} /> </form>
Получение события с файлом и последующий вызов обработчика загрузки изображения
handleFile(event) { const reader = new FileReader(); reader.readAsDataURL(file); this.handleImgUpload(file);
Обработчик загрузки изображения, который получит подписанный запрос и доставит изображение на S3.
Примечание. Здесь мы показываем неотредактированные два метода запроса, потому что изначально у $.ajax были проблемы с возможностью вложения после промиса. Мы используем библиотеку axios, чтобы сделать запрос PUT на S3 с файлом изображения. Рекомендуется провести рефакторинг в один метод. Обновленный подход будет обновлен здесь, когда позволит время.
handleImgUpload(file) { // First Request to the server const promise = $.ajax({ url: '/sign-s3', type: "GET", data: { 'file-name': file.name, 'file-type': file.type }, dataType: 'json' }); // Promise returns with the signedRequest promise.done(function(data){ var options = { headers: { 'Content-Type': file.type } }; // Upload the file with the signedRequest to S3 axios.put(data.signedRequest, file, options) .then(function(){ _this.setState({ picLink: data.url, signedRequest: data.signedRequest }); }); }); }