1.当我使用AmazonS3Client在亚马逊s3文件存储上传文件时.2.当我尝试一次上传多个文件时,它会提供异常:但是同一个文件有多个线程.我尝试了客户端配置,例如:1.connectionTimeout = 50000 in ms 2.maxConnections = 500 3.socketTimeout = 50000 in ms
Exception stacktrace:
com.amazonaws.AmazonClientException: Data read has a different length than the expected: dataLength=8192; expectedLength=79352; includeSkipped=false; in.getClass()=class com.amazonaws.internal.ResettableInputStream; markedSupported=true; marked=0; resetSinceLastMarked=false; markCount=1; resetCount=0
at com.amazonaws.util.LengthCheckInputStream.checkLength(LengthCheckInputStream.java:150)
at com.amazonaws.util.LengthCheckInputStream.read(LengthCheckInputStream.java:110)
at com.amazonaws.internal.SdkFilterInputStream.read(SdkFilterInputStream.java:73)
at com.amazonaws.event.ProgressInputStream.read(ProgressInputStream.java:151)
at com.amazonaws.internal.SdkFilterInputStream.read(SdkFilterInputStream.java:73)
at org.apache.http.entity.InputStreamEntity.writeTo(InputStreamEntity.java:98)
at com.amazonaws.http.RepeatableInputStreamRequestEntity.writeTo(RepeatableInputStreamRequestEntity.java:153)
at org.apache.http.entity.HttpEntityWrapper.writeTo(HttpEntityWrapper.java:98)
at org.apache.http.impl.client.EntityEnclosingRequestWrapper$EntityWrapper.writeTo(EntityEnclosingRequestWrapper.java:108)
at org.apache.http.impl.entity.EntitySerializer.serialize(EntitySerializer.java:122)
at org.apache.http.impl.AbstractHttpClientConnection.sendRequestEntity(AbstractHttpClientConnection.java:271)
at org.apache.http.impl.conn.ManagedClientConnectionImpl.sendRequestEntity(ManagedClientConnectionImpl.java:197)
at org.apache.http.protocol.HttpRequestExecutor.doSendRequest(HttpRequestExecutor.java:257)
at com.amazonaws.http.protocol.SdkHttpRequestExecutor.doSendRequest(SdkHttpRequestExecutor.java:47)
at org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:125)
at org.apache.http.impl.client.DefaultRequestDirector.tryExecute(DefaultRequestDirector.java:713)
at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:518)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:906)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:805)
at com.amazonaws.http.AmazonHttpClient.executeOneRequest(AmazonHttpClient.java:647)
at com.amazonaws.http.AmazonHttpClient.executeHelper(AmazonHttpClient.java:441)
at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:292)
at …Run Code Online (Sandbox Code Playgroud) 我有一个 Angular webapp,它使用 Spring Boot REST 服务作为其支持的 web 服务。
我正在为用户添加“个人资料”功能,作为其中的一部分,我想建立一个端点,允许用户为自己上传个人资料图像并立即将这些文件上传到 S3(我将在其中托管所有图像)。
看几个Spring Boot/文件上传教程:
似乎处理此类文件上传的标准方法是公开一个接受MultipartFiles如下的控制器端点:
@RestController
@RequestMapping("/v1/profiles")
public class ProfileController {
@PostMapping("/photo")
public ResponseEntity uploadProfilePhoto(@RequestParam("mpf") MultipartFile mpf)
// ...
}
Run Code Online (Sandbox Code Playgroud)
查看所有这些代码,我无法判断该MultipartFile实例是否在内存中,或者 Spring 是否将其位置设置/tmp在磁盘上的某个位置(可能在?下)。
查看AWS S3 Java SDK 教程,上传基于磁盘的文件的标准方法似乎是这样的:
File file = new File(uploadFileName);
s3client.putObject(new PutObjectRequest(bucketName, keyName, file));
Run Code Online (Sandbox Code Playgroud)
所以看起来我必须在磁盘上有一个文件才能上传到 S3。
我想知道是否有办法将所有内容保存在内存中,或者这是否是一个坏主意,我应该坚持使用磁盘/File实例!
MultipartFile)保存在控制器方法中的内存中?MultipartFile向 S3提供(也许通过序列化?!)一个实例PutObjectRequest?amazon-s3 ×2
java ×2
amazon ×1
file-upload ×1
hash ×1
hashcode ×1
md5 ×1
multipart ×1
spring ×1
spring-boot ×1