微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决AmazonClientException:读取的更多数据与预期的长度不同

当我尝试将内容上传到 Amazon S3 存储桶时,我收到 AmazonClientException:读取的数据长度与预期不同。

这是我的代码

 public Object uploadFile(multipartfile file) {
        String fileName = System.currentTimeMillis() + "_" + file.getoriginalFilename();
        log.info("uploadFile-> starting file upload " + fileName);

        Path path = Paths.get(file.getoriginalFilename());
        File fileObj = new File(file.getoriginalFilename());

        try (FileOutputStream os = new FileOutputStream(fileObj)) {
            os.write(file.getBytes());
            os.close();
            String uploadFilePath = bucketName + "/" + uploadpath;
            s3Client.putObject(new PutObjectRequest(uploadFilePath,fileName,fileObj));
            Files.delete(path);
        } catch (IOException ex) {
            log.error("error [" + ex.getMessage() + "] occurred while uploading [" + fileName + "] ");
        }
        log.info("uploadFile-> file uploaded process completed at: " + LocalDateTime.Now() + " for - " + fileName);
        return "File uploaded : " + fileName;
    }

解决方法

亚马逊建议使用 Amazon S3 Java V2 API 而不是 V1。

适用于 Java 2.x 的 AWS 开发工具包是对 1.x 版代码库的主要重写。它构建在 Java 8+ 之上,并添加了几个经常请求的功能。其中包括对非阻塞 I/O 的支持以及在运行时插入不同 HTTP 实现的能力。

要将内容上传到 Amazon S3 存储桶,请使用此 V2 代码。

public static String putS3Object(S3Client s3,String bucketName,String objectKey,String objectPath) {

        try {

            Map<String,String> metadata = new HashMap<>();
            metadata.put("myVal","test");

            PutObjectRequest putOb = PutObjectRequest.builder()
                    .bucket(bucketName)
                    .key(objectKey)
                    .metadata(metadata)
                    .build();

            PutObjectResponse response = s3.putObject(putOb,RequestBody.fromBytes(getObjectFile(objectPath)));

           return response.eTag();

        } catch (S3Exception e) {
            System.err.println(e.getMessage());
            System.exit(1);
        }
        return "";
    }

Full example here

如果您不熟悉 V2,请参阅此文档主题:

https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/get-started.html

,

AWS Java 开发工具包 1.x

s3.putObject(bucketName,key,new File(filePath));

AWS Java SDK 2.X

PutObjectRequest putObjectRequest = PutObjectRequest
  .builder()
  .bucket(bucketName)
  .key(key)
  .build();

s3Client.putObject(putObjectRequest,Paths.get(filePath));

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。