#java #amazon-web-services #amazon-s3 #pre-signed-url
#java #amazon-веб-сервисы #amazon-s3 #предварительно подписанный url
Вопрос:
Я создаю предварительно подписанные URL-адреса S3, чтобы клиент (мобильное приложение) мог помещать изображение непосредственно в S3 вместо прохождения службы. Для моего варианта использования время истечения срока действия предварительно подписанного URL-адреса должно быть настроено на более длительное окно (10-20 минут). Поэтому я хочу ограничить размер загрузки файлов в S3, чтобы любой злоумышленник не мог загружать большие файлы в корзину S3. Клиент получит URL-адрес от службы, которая имеет доступ к корзине S3. Я использую AWS Java SDK.
Я обнаружил, что это можно сделать с помощью почтовых форм для загрузки в браузер, но как я могу это сделать, используя только что подписанный URL-адрес S3 PUT?
Комментарии:
1. Недоступно с предварительно подписанными URL-адресами ввода afaik. Вы можете отвечать на загрузки с помощью лямбда-триггера и удалять большие объекты (или предупреждать пользователя или делать что-то еще).
2. Вы можете установить точный размер объекта, но вы не можете его ограничить (например, вы можете ограничить указанный URL-адрес объектом размером 5 МБ, но не для объекта размером не более 5 МБ), может ли это вам помочь?
Ответ №1:
Я впервые использовал S3-Signed-URLS и также был обеспокоен этим. И я думаю, что все эти подписанные URL-адреса немного болезненны, потому что вы не можете установить для них ограничение на максимальный размер объекта / загрузки.
Я думаю, что это что-то очень важное для загрузки файлов в целом, чего просто не хватает..
При отсутствии этой опции вы вынуждены решать эту проблему со временем истечения срока действия и т. Д. Это становится действительно грязным..
Но, похоже, вы можете использовать сегменты S3 также с обычными Post-запросами, для которых в их политике есть параметр content-length. Поэтому я, вероятно, в будущем обменяю свои подписанные URL-адреса на POST-Routes.
Я думаю, что для правильных, более крупных приложений это правильный путь. (?)
Что может помочь с вашей проблемой:
В JavaScript SDK есть метод / функция, которая предоставляет вам только метаданные объекта S3 (включая размер файла) без загрузки всего файла.
Это называется s3.headObject()
Я думаю, что после завершения загрузки AWS требуется некоторое время для обработки этого вновь загруженного файла, а затем он доступен в вашем корзине.
Что я сделал, так это установил таймер после каждой загрузки, чтобы проверить размер файла, и если он больше 1 МБ, он удалит файл. Я думаю, что для производства вы хотите записать это где-нибудь в БД. Мои имена файлов также включают идентификатор пользователя, который загрузил файл. Таким образом, вы можете заблокировать учетную запись после слишком большой загрузки, если захотите.
Это сработало для меня в javascript..
function checkS3(key) {
return new Promise((resolve, reject) => {
s3.headObject(headParams, (err, metadata) => {
console.log("setTimeout upload Url");
if (err amp;amp; ["NotFound", "Forbidden"].indexOf(err.code) > -1) {
// console.log(err);
return reject(err);
//return resolve();
} else if (err) {
const e = Object.assign({}, Errors.SOMETHING_WRONG, { err });
// console.log(e);
// console.log(err);
return reject(e);
}
return resolve(metadata);
});
});
}
Комментарии:
1. Он запрашивает Java, а не javascript. Поэтому я думаю, что это не по теме
2. вот почему я сказал, что это js, также информация getheader, вероятно, также доступна в java (?)….