S3Service.java 3.03 KB
package com.ruoyi.web.controller.common;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
import software.amazon.awssdk.core.ResponseInputStream;
import software.amazon.awssdk.core.sync.RequestBody;
import software.amazon.awssdk.services.s3.S3Client;
import software.amazon.awssdk.services.s3.model.GetObjectRequest;
import software.amazon.awssdk.services.s3.model.PutObjectRequest;
import software.amazon.awssdk.services.s3.model.S3Exception;

import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.UUID;

@Service
public class S3Service {

    private final S3Client s3Client;

    @Value("${aws.bucket}")
    private String bucketName;

    public S3Service(S3Client s3Client) {
        this.s3Client = s3Client;
    }

    public String upload(@RequestParam("file") MultipartFile file) throws IOException {
        String uuid = UUID.randomUUID().toString().replace("-", "");
        String fileName = file.getOriginalFilename();
        //生成新的文件
        String suffix = fileName.substring(fileName.lastIndexOf("."));
        String newFileName = uuid + suffix;
        PutObjectRequest putObjectRequest = PutObjectRequest.builder().bucket(bucketName)
                .key(newFileName)
                .build();
        File tempFile = File.createTempFile("temp", null);
        file.transferTo(tempFile);
        s3Client.putObject(putObjectRequest, RequestBody.fromFile(tempFile));
        tempFile.delete();
        return newFileName;
    }


    public void down(String fileName, HttpServletResponse response) {
        try {
            GetObjectRequest getObjectRequest = GetObjectRequest.builder()
                    .bucket(bucketName)
                    .key(fileName)
                    .build();
            // 设置响应头
            response.setHeader("Content-Disposition", "attachment; filename=\"" + URLEncoder.encode(fileName, StandardCharsets.UTF_8.toString()) + "\"");
            response.setContentType("application/octet-stream");

            ResponseInputStream<?> responseInputStream = s3Client.getObject(getObjectRequest);
            OutputStream fileOutputStream = response.getOutputStream();
            byte[] buffer = new byte[1024];
            int bytesRead;
            while ((bytesRead = responseInputStream.read(buffer)) != -1) {
                fileOutputStream.write(buffer, 0, bytesRead);
            }
            fileOutputStream.flush();
            System.out.println("Object '" + fileName + "' downloaded from bucket '" + bucketName + "' successfully.");
        } catch (IOException e) {
            System.err.println("Error downloading object: " + e.getMessage());
        } catch (S3Exception e) {
            System.err.println("Error downloading object: " + e.getMessage());
        }

    }

}