Я хотел бы понять, почему это может произойти и как заставить клиентскую сторону более надежным.
Код: Выделить всё
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
Мобильная версия