我試圖使用Spring boot將影像上傳到S3 Bucket,但我得到了以下錯誤。 沒有為流資料指定內容長度。 流內容將在記憶體中被緩沖,可能會導致記憶體不足的錯誤。
FileStore.java
public void save( String path,
String fileName,
Optional<Map<String, String>> optionalMetadata,
InputStream inputStream) {
ObjectMetadata metadata = new ObjectMetadata()。
optionalMetadata.ifPresent(map -> {
if (!map.isEmpty() ) {
map.forEach(metadata::addUserMetadata)。
}
});
try {
s3.putObject(path, fileName, inputStream, metadata)。
} catch (AmazonServiceException e) {
throw new IllegalStateException("Failed to store file to s3"/span>, e);
}
Service.java
//get file Metadata
Map<String, String> metadata = extractMetadata(file);
//Upload to S3 bucket
String path = String.format("%s/%s"/span>, BucketName.PROFILE_IMAGE.getBucketName(), id) 。
try {
filestore.save(path, "profileImage", Optional.of(metadata), file.getInputStream() )。
player.setPlayerProfileImageLink(path "/profileImage.jpg") 。
} catch (IOException e) {
throw new IllegalStateException(e)。
}
}
private Map<String, String> extractMetadata(MultipartFile file) {
Map<String,String> metadata = new HashMap<>()。
metadata.put("Content-type", file.getContentType())。
metadata.put("Content-length",String.valueOf(file.getSize()))。
return metadata。
}
我按照一個教程來做,在一段時間內運行良好,但現在我總是得到同樣的錯誤,我不知道為什么。
uj5u.com熱心網友回復:
把方法改成這樣,就成功了:
public void uploadFile(String bucketName。字串keyName, MultipartFile file) {
try {
ObjectMetadata metadata = new ObjectMetadata() 。
metadata.setContentLength(file.getSize())。
s3.putObject(bucketName, keyName, file.getInputStream(), metadata)。
} catch (IOException ioe) {
throw new IllegalStateException("IOException: " ioe.getMessage())。
} catch (AmazonServiceException serviceException) {
throw new IllegalStateException("AmazonServiceException: " serviceException.getMessage())。
}
uj5u.com熱心網友回復:
這個錯誤清楚地表明,你缺少請求中的Content-Length頭來放置物件。如果你想直接使用InputStream把物件放到S3,Content-Length頭就成為必須的。
實際上,你正在將Content-Length等元資料添加到用戶的元資料中,這是不正確的。addUserMetadata方法是用來添加用戶特定的元資料的,比如你想給你的S3物件添加標簽。
從檔案中可以看出。
addUserMetadata(String key, String value)
添加相關物件的自定義用戶元資料的鍵值對。 物件的自定義用戶元資料的鍵值對。
要設定Content-Length,請使用setContentLength(long contentLength)方法代替。
下面是檔案的鏈接,其中列出了ObjectMetadata的所有可用方法 - https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/model/ObjectMetadata.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/319184.html
標籤:
上一篇:如何阻止用戶編輯對方的資訊?
下一篇:方法被呼叫兩次
