Работа загрузки файла S3 - PullRequest
0 голосов
/ 03 мая 2018

Чтобы загрузить файл из S3 с помощью java SDK, нам нужно сделать следующее -> Примечание. Многопользовательская загрузка отключена.

S3Object s3Object = s3.getObject(getObjectRequest);
S3ObjectInputStream s3ObjectInputStream = s3Object.getObjectContent();
//Write to a file from this stream

Когда мы выполняем вызов getObject, SDK выполняет вызов GET для этого объекта. Этот вызов возвращает только заголовки ответа.

Когда мы на самом деле начинаем чтение из s3ObjectInputStream, мы получаем тело ответа. Но это все один вызов REST.

Итак, я был озадачен, почему вызов вернул сначала только заголовки. А как S3 узнал, когда начинать отправку в теле ответа?

Мы делаем только один вызов, так как мы уведомляем S3 о том, что мы сейчас начали чтение из s3ObjectInputStream. Где хранится фактический файл, пока мы не прочитаем его из потока?

1 Ответ

0 голосов
/ 04 мая 2018

S3 немедленно начинает отправку тела ответа.

Вы просто не начали читать его из сети.

getObject

Будьте предельно осторожны при использовании этого метода; возвращенный объект Amazon S3 содержит прямой поток данных из HTTP-соединения. Базовое HTTP-соединение не может быть повторно использовано, пока пользователь не закончит чтение данных и не закроет поток.

https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/AmazonS3.html#getObject-com.amazonaws.services.s3.model.GetObjectRequest-

Небольшое количество было буферизовано, но объект нигде не хранится. Сетевое соединение остановлено. Если бы вы запустили запрос и подождали достаточно времени, прежде чем читать его, S3 в конце концов обнаружил бы, что соединение остановлено, отказалось и закрыло соединение.

На практике легко отделить заголовки HTTP от тела в потоке, потому что граница между ними всегда точно равна \r\n\r\n. Эта 4-байтовая последовательность недопустима в заголовках и является обязательной после заголовков, поэтому SDK просто прекращает извлекать заголовки в этой точке в ответе от S3 и создает и возвращает объект ответа, из которого вы можете прочитать тело из потока из сеть.

...