Android: периодически появляется ошибка 404 NoSuchKey при загрузке того же объекта S3 с Android (AWS SDK v2).Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Android: периодически появляется ошибка 404 NoSuchKey при загрузке того же объекта S3 с Android (AWS SDK v2).

Сообщение Anonymous »

Я использую AWS SDK для Java V2 на Android для загрузки аудиофайлов .AAC из ковша S3. Для того же ключа загрузки периодически терпят неудачу с Nosuchkey (404). Если я снова открою приложение или попробую позже, тот же ключ работает без каких-либо изменений. < /P>
Я хотел бы понять, почему это может произойти и как заставить клиентскую сторону более надежным.

Код: Выделить всё

Android 15 (SDK 35), POCO device
AWS SDK for Java v2 (S3): 2.x.x
Bucket region: eu-west-1 (client configured to the same region)
IAM: read access to the audio prefix
Ошибка (пример):

Код: Выделить всё

software.amazon.awssdk.services.s3.model.NoSuchKeyException: The specified key does not exist.
Service: S3, Status Code: 404, Request ID: MCZP4XMJHPPPQHFT, Extended Request ID: ygGBV...
Мой метод получения:

Код: Выделить всё

fun getObjectBytes(bucketName: String, keyName: String, folder: String): Boolean {
try {
val aws = AWSConnection()
val objectRequest = GetObjectRequest
.builder()
.key("$folder/$keyName")
.bucket(bucketName)
.build()

val objectBytes = aws.s3Client.getObjectAsBytes(objectRequest)
val data = objectBytes.asByteArray()
writeToLocal(data, keyName)
return true
} catch (e: IOException) {
e.logException()
return false
} catch (e: S3Exception) {
e.logException()
return false
} catch (e: Exception) {
e.logException()
return false
}
}
Как это назвать:
private fun downloadAudio(uri: Uri, audioFilename: String, s3Folder: String){
if (!Http.isOnline){
confirmInternetConnection(uri, audioFilename, s3Folder)
}else{
val taskRunner = TaskRunner()
taskRunner.executeAsync(DownloadAudioTask(s3Service, audioFilename, s3Folder)) { fileGet: Boolean ->
if (!fileGet){
alertCannotGetFile()
}else{
playAudio(uri)
}
}
}
}

class DownloadAudioTask(
private val s3Service: IS3StorageService,
private val filename: String,
private val s3Folder: String) : Callable {
override fun call(): Boolean {
return s3Service.getObjectBytes(props.aws.s3.audioBucketName, filename, s3Folder)
}
}
< /code>
Что я уже пробовал: < /p>
Retries with exponential backoff + jitter (up to 5 attempts) → when it fails, it fails for all immediate retries.

Prior headObject → sometimes GET fails even if HEAD didn’t throw.

Key normalization (avoid //, trim spaces, NFC for Unicode).

Single S3Client instance and fixed region (no per-call client creation).

Verified the GET is always using the exact key "$folder/$fileName".
< /code>
Что я ищу для < /p>
Вероятно, причины прерывистого nosuchkey для одного и того же ключа (например, ведение версии ведра с маркером удаления как последнее, префикс IAM, которые маскируют как 404, региона Mismatches, etc.). Запустите.>

Подробнее здесь: https://stackoverflow.com/questions/797 ... t-from-and
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»