Java 将多部分文件上载到S3

Java 将多部分文件上载到S3,java,spring-boot,amazon-s3,Java,Spring Boot,Amazon S3,我使用的是SpringBoot,请求中有一个需要上传到S3的多部分文件,但S3只支持上传到S3的文件(不是多部分文件)。 如何将多部分文件上载到s3您可以将多部分文件转换为如下文件: private File convertMultiPartToFile(MultipartFile file) throws IOException { File convFile = new File(file.getOriginalFilename()); FileOutputStream fo

我使用的是SpringBoot,请求中有一个需要上传到S3的多部分文件,但S3只支持上传到S3的文件(不是多部分文件)。
如何将多部分文件上载到s3

您可以将多部分文件转换为如下文件:

private File convertMultiPartToFile(MultipartFile file) throws IOException {
    File convFile = new File(file.getOriginalFilename());
    FileOutputStream fos = new FileOutputStream(convFile);
    fos.write(file.getBytes());
    fos.close();
    return convFile;
}
但这将在您的系统中创建一个文件,您需要在上载文件后使用以下方法将其删除:

if(file.exists()){
  FileUtils.deleteQuietly(file);
}
但是,如果您不想涉及此路径,那么可以直接将流上载到s3

PutObjectRequest(String bucketName, String key, InputStream input, ObjectMetadata metadata)
其中:

input =file.getinputstream();
ObjectMetadata metadata=new ObjectMetadata();
metadata.setContentLength(file.size());

您可以执行以下操作:

public class S3Utility{
    public static String upload(String bucket, String fileName, InputStream inputStream, String contentType, AmazonS3 s3Client, boolean isPublic) {
    if (inputStream != null) {
      try {
        ObjectMetadata meta = new ObjectMetadata();
        meta.setContentLength(inputStream.available());
        meta.setContentType(contentType);

        PutObjectRequest putObjectRequest = new PutObjectRequest(bucket, fileName, inputStream, meta);

        if (isPublic) {
          putObjectRequest = putObjectRequest.withCannedAcl(CannedAccessControlList.PublicRead);
        }

        PutObjectResult result = S3Util.getAmazonS3Client(s3Client).putObject(putObjectRequest);
        if (result != null) {
          return fileName;
        }

      } catch (Exception e) {
        log.error("Error uploading file on S3: ", e);
      }
    } else {
      log.warn("Content InputStream is null. Not Uploading on S3");
    }
    return null;
  }
}


@RestController
 public class TestController{


   @PostMapping(path = "upload/file", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    public ResponseEntity<String> uploadStampPageImage( @RequestPart(value = "file") MultipartFile imageFile) {

        if(Objets.nonNull(file)){
          String uploadedFilePath = S3Utility.upload("myBucket","myFile.jpg",file.getInputStream(),file.getContentType(), amazonS3Client, true);
          return new ResponseEntity.ok(uploadedFilePath);
        }
        return new ResponseEntity.failure("Not uploaded");

    }

}

 }
公共类实用程序{
公共静态字符串上载(字符串存储桶、字符串文件名、InputStream InputStream、字符串contentType、AmazonS3 s3Client、布尔isPublic){
如果(inputStream!=null){
试一试{
ObjectMetadata meta=新的ObjectMetadata();
setContentLength(inputStream.available());
setContentType(contentType);
PutObjectRequest PutObjectRequest=新的PutObjectRequest(bucket、文件名、inputStream、meta);
如果(iPublic){
putObjectRequest=putObjectRequest.withCannedAcl(CanneDaccessController.PublicRead);
}
PutObjectResult=S3Util.getAmazonS3Client(s3Client).putObject(putObjectRequest);
如果(结果!=null){
返回文件名;
}
}捕获(例外e){
log.error(“在S3上上载文件时出错:”,e);
}
}否则{
log.warn(“内容InputStream为空。未在S3上上载”);
}
返回null;
}
}
@RestController
公共类测试控制器{
@PostMapping(path=“upload/file”,consumes=MediaType.MULTIPART\u FORM\u DATA\u VALUE)
public ResponseEntity uploadStampPageImage(@RequestPart(value=“file”)MultipartFile imageFile){
if(Objets.nonNull(文件)){
String uploadedFilePath=S3Utility.upload(“myBucket”、“myFile.jpg”、file.getInputStream()、file.getContentType()、amazonS3Client,true);
返回新的ResponseEntity.ok(uploadedFilePath);
}
返回新的响应。失败(“未上载”);
}
}
}

但是哪一种更好?如果你不能用一种方法做某事,那么你必须用另一种方法。了解如何将请求作为多部分接受,然后在后端将其作为文件提交给s3。