AmazonClientException:数据读取的长度与预期的不同

1.当我使用AmazonS3Client在amazon s3文件存储上传文件时。 2.当我尝试一次上传多个文件时,它会提供exception:但是同一个文件有多个线程。 我尝试了客户端配置,例如: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 com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:3655) at com.amazonaws.services.s3.AmazonS3Client.putObject(AmazonS3Client.java:1424) at com.amazonaws.services.s3.transfer.internal.UploadCallable.uploadInOneChunk(UploadCallable.java:135) at com.amazonaws.services.s3.transfer.internal.UploadCallable.call(UploadCallable.java:127) at com.amazonaws.services.s3.transfer.internal.UploadMonitor.call(UploadMonitor.java:129) at com.amazonaws.services.s3.transfer.internal.UploadMonitor.call(UploadMonitor.java:50) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at java.lang.Thread.run(Thread.java:745)** 

这个答案来自AWS Hanson的家伙:

是否可能已完全读取请求中指定的输入流?

如果输入流是文件流,您是否尝试在请求中指定原始文件而不是文件的输入流?

使用示例代码改进@iucasddaniel答案。

AmazonS3Client putObject:没有为流数据指定内容长度。 流内容将缓冲在内存中,可能导致内存不足错误。

解决方案«指定对象元数据内容长度

 File tempFile = "D://Test.mp4"; String bucketName = "YashFiles", filePath = "local/mp4/"; FileInputStream sampleStream = new FileInputStream( tempFile ); byte[] byteArray = IOUtils.toByteArray( sampleStream ); Long contentLength = Long.valueOf(byteArray.length); sampleStream.close(); ObjectMetadata objectMetadata = new ObjectMetadata(); objectMetadata.setContentLength(contentLength); TransferManager tm = new TransferManager(credentials); FileInputStream stream = new FileInputStream( tempFile ); PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, filePath, stream,objectMetadata); Upload myUpload = tm.upload(putObjectRequest); if (myUpload.isDone() == false) { System.out.println("Transfer: "+ myUpload.getDescription()); System.out.println(" - State: "+ myUpload.getState()); System.out.println(" - Progress: "+ myUpload.getProgress().getBytesTransferred()); } myUpload.waitForCompletion(); tm.shutdownNow(); stream.close(); org.apache.commons.io.FileUtils.forceDelete( tempFile ); 

Amazon S3:检查密钥存在并生成PresignedUrl