Могу ли я получить информацию заголовка Content-Length из предварительно подписанного URL-адреса Amazon S3 с помощью клиента OkHttp3?

У нас есть некоторые службы Java, которые загружают файлы в хранилище, совместимое с S3, и генерируют предварительно подписанные URL-адреса. Другие службы Java получают такие URL-адреса и работают с файлами. Нам нужна длина содержимого этого файла, без загрузки всего объекта из тела. Это возможно? И если да, то как?

Мы загружаем через

com.amazonaws.services.s3.AmazonS3.putObject()

и создайте URL-адреса с

com.amazonaws.services.s3.AmazonS3.generatePresignedUrl()

Когда я проверяю заголовки Http файла с помощью своего браузера S3, я вижу правильную запись Content-Length.

Но в наших услугах мы используем

OkHttpClient.newCall(
    new Builder().get()
        .url(url).build()
).execute();

И в этих объектах Response нет Content-Length.


person Patrick Rode    schedule 04.02.2021    source источник


Ответы (1)


Если ответ передается в потоковом режиме (по частям HTTP/1.1) или сжимается, у него не будет длины содержимого для чтения. Вероятно, вы можете использовать запрос HEAD, чтобы получить заголовки без тела и сначала проверить.

https://stackoverflow.com/a/38673237/1542667

person Yuri Schimke    schedule 04.02.2021
comment
Я получаю ошибку 403, когда пытаюсь выполнить запрос HEAD. Также ваше предположение кажется правильным - я вижу протокол HTTP/1.1 в обоих вызовах OkHttp. Но я также попробовал `URL url = новый URL(server.com/file.mp3); URLConnection urlConnection = url.openConnection(); URLConnection.connect(); int file_size = urlConnection.getContentLength(); ` и это дает мне правильную длину содержимого. Я все еще немного не уверен, почему я не могу использовать для этого клиент OkHttp3. Но в любом случае, я могу работать с этим. - person Patrick Rode; 05.02.2021
comment
OkHttp автоматически применяет сжатие. Вы можете попробовать отключить этот stackoverflow.com/a/41165617/1542667 - person Yuri Schimke; 05.02.2021