SpringBoot + minio实现上传

目录

minio桶权限配置

minioDemo

添加依赖:

 minio的yml配置及配置类

简易工具类

testdemo


minio桶权限配置

首先创建一个用户,然后创建一个组,创建的时候就可以把这个用户添加到组中,然后选中组分配读写权限就OK了

SpringBoot + minio实现上传_第1张图片

 

SpringBoot + minio实现上传_第2张图片

minioDemo

紧接着写一个springboot的Demo熟悉一下minio使用

添加依赖:

 
            io.minio
            minio
            8.5.2
        

 minio的yml配置及配置类

 #minio配置
  minio:
    endpoint: http://127.0.0.1:9005/
    #minio用户名
    accessKey: admin
    #minio密码
    secretKey: 12345678
    #桶
    bucketName: public
    #默认 10分钟,单位为秒
    preview-expires: 600

@Configuration
@Component
@ConfigurationProperties(prefix = "spring.minio")
@Setter
@Getter
public class MinioConfig {

    private static final Logger log = LoggerFactory.getLogger(MinioConfig.class);
    private String endpoint;
    private String accessKey;
    private String secretKey;
    private String bucketName;
    private String publicBucketName = "public";
    private int previewExpires = 3600;

    @Bean
    public MinioClient getMinioClient() {
        log.info("开始===初始化minioClient");
        //初始化minioClient
        MinioClient minioClient = MinioClient.builder().endpoint(endpoint)
                .credentials(accessKey, secretKey)
                .build();
        return minioClient;
    }

}

这里如果有以下警告,大致意思是未配置springboot配置注释处理器

Spring Boot Configuration Annotation Processor not configured

请添加依赖


            org.springframework.boot
            spring-boot-configuration-processor
            true
        

简易工具类

@Component
public class MinioClientUtils {

    private static final Logger log = LoggerFactory.getLogger(MinioClientUtils.class);

    private MinioClient minioClient;

    public MinioClientUtils(MinioClient minioClient) {
        this.minioClient = minioClient;
    }

    /**
     * 文件上传
     * @param file 文件
     * @param bucketName 桶
     * @return
     */
    public Map uploadFile(MultipartFile file, String bucketName) {

        String filename = FileUtils.extractUploadFilename(file);
        try {
            InputStream inputStream = file.getInputStream();
            // 上传到minio服务器
            minioClient.putObject(PutObjectArgs.builder()
                    .bucket(bucketName)
                    .object(filename)
                    .stream(inputStream, -1L, 10485760L)
                    .build());
        } catch (Exception e) {
            e.printStackTrace();
        }
        // 返回地址
        Map resultMap = new HashMap<>();
        resultMap.put("url", filename);
        return resultMap;
    }

    /**
     * 文件下载
     * @param fileName 文件名称
     * @param response HttpServletResponse
     * @param bucketName 桶名称
     */
    public void downloadFile(@NotNull String fileName,
                             @NotNull String originalName,
                             HttpServletResponse response,
                             @NotNull String bucketName) {

        InputStream inputStream = null;
        ServletOutputStream outputStream = null;
        try {

            // 获取文件对象
            inputStream = minioClient.getObject(GetObjectArgs.builder().bucket(bucketName).object(fileName).build());
            int length = 0;
            response.reset();
            byte[] buf = new byte[1024000];
            response.setCharacterEncoding("utf-8");
            response.setContentType("application/octet-stream");
            response.addHeader("Content-Disposition", "attachment;fileName=" + new String(originalName.getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1));
            outputStream = response.getOutputStream();
            // 输出文件
            while ((length = inputStream.read(buf)) > 0) {
                outputStream.write(buf, 0, length);
            }
            inputStream.close();
            outputStream.flush();
        } catch (Throwable ex) {
            response.setHeader("Content-type", "text/html;charset=UTF-8");
            String data = "文件下载失败";
            try {
                OutputStream ps = response.getOutputStream();
                ps.write(data.getBytes("UTF-8"));
            } catch (IOException e) {
                e.printStackTrace();
            }
        } finally {
            try {
                outputStream.close();
                if (inputStream != null) {
                    inputStream.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 删除文件
     * @param fileName 文件名
     * @param bucketName 桶名称
     */
    public void delFile(String fileName,
                        String bucketName) throws Exception{
        minioClient.removeObject(RemoveObjectArgs.builder().bucket(bucketName).object(fileName).build());
    }

}


public class FileUtils {
    /**
     * 设置上传的文件名
     * 规则 文件名+时间戳+后缀
     * @param file 文件
     * @return
     */
    public static final String extractUploadFilename(MultipartFile file) {
        String fileName = file.getOriginalFilename();
        String[] fileArray = fileName.split("\\.");
        fileName = fileArray[0]+System.currentTimeMillis()+"."+fileArray[1];
        return fileName;
    }
}

testdemo

上传测试:

@SpringBootTest
@Slf4j
@RunWith(SpringRunner.class)
public class MinioFileTest {
    @Resource
    private MinioClientUtils minioClientUtils;

    @Test
    public void uploadFile() throws Exception {
        File file = new File("D:\\学习\\high.txt");
        FileInputStream fileInputStream = new FileInputStream(file);
        MultipartFile multipartFile = new MockMultipartFile("copy" + file.getName(), file.getName(), "application/octet-stream", fileInputStream);
        minioClientUtils.uploadFile(multipartFile,"public");
    }

    @Test
    public void deleteFile() throws Exception {

        minioClientUtils.delFile("high1685522002778.txt","public");
    }

}

下载测试

@Slf4j
@RestController
@RequestMapping("/minio-test")
public class MinioController {

    private final MinioClientUtils minioClientUtils;

    @Autowired
    public MinioController(MinioClientUtils minioClientUtils) {
        this.minioClientUtils = minioClientUtils;
    }

    /**
     *  单文件下载
     *  fileName 文件名
     */
    @GetMapping("/download")
    public void download(HttpServletResponse response) throws Exception{
        String fileName = "high1685527608201.txt";
        String originalName = "high.txt";
        minioClientUtils.downloadFile(fileName,originalName,response,"public");
    }

}

postman测试下载注意使用这个按钮

SpringBoot + minio实现上传_第3张图片

 

你可能感兴趣的:(spring,boot,java,spring)