即使我使用的是高級 multipart 我仍然在控制臺中收到警告:
WARN - com.amazonaws.services.s3.AmazonS3Client - No content length specified for stream data. Stream contents will be buffered in memory and could result in out of memory errors.
這就是我使用高級分段上傳的方式,就像這里一樣:https : //docs.aws.amazon.com/AmazonS3/latest/userguide/mpu-upload-object.html
val tm: TransferManager = TransferManagerBuilder
.standard()
.withS3Client(s3Client)
.withMultipartUploadThreshold(5248000)
.build();
val metadata = new ObjectMetadata()
metadata.setContentType(mimeType)
val request = new PutObjectRequest(bucketName, key, inputStream, metadata)
val upload = tm.upload(request)
upload.waitForCompletion()
5248000 是 5MB,我嘗試上傳比這大得多的檔案,因此它應該使用withMultipartUploadThreshold檔案中所說的多部分策略:
設定何時使用分段上傳的大小閾值(以位元組為單位)。超過此大小的上傳將自動使用分段上傳策略,而小于此閾值的上傳將使用單個連接上傳整個物件。
為什么它仍然給出這個警告?
uj5u.com熱心網友回復:
適用于 Java 的 AWS 開發工具包的檔案在 ObjectMetadata 上提到了這一點:
將物件上傳到 S3 時需要此欄位,但 Amazon Web Services S3 Java 客戶端在直接處理檔案時會自動設定它。直接從流上傳時,請盡可能設定此欄位。否則,客戶端必須緩沖整個流,以便在將資料發送到 Amazon S3 之前計算內容長度。
換句話說,metadata.setContentLength(x)在構造PutObjectRequest物件之前,您需要顯式呼叫檔案或流大小。如果不這樣做,AWS 開發工具包將需要在 ram 中緩沖整個流,這可能會耗盡較大物件的記憶體,從而觸發您看到的警告。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/355136.html
標籤:亚马逊网络服务 亚马逊-s3 aws-sdk-java
上一篇:無法恢復AWSEC2公共IP地址
