SpringBoot+swagger连接MinIO实现文件的上传下载和删除

SpringBoot+swagger连接MinIO实现文件的上传下载和删除

废话不多说,直接上干货!

minio中文文档地址:

http://docs.minio.org.cn/docs/master/java-client-quickstart-guide

maven引入

<dependency>
    <groupId>io.minio</groupId>
    <artifactId>minio</artifactId>
    <version>7.0.2</version>
</dependency>

MinIOController.java

RestController
@Api(tags = "minio操作")
@RequestMapping("/minio")
public class MinIOController {

    @Autowired
    MinIOService minIOService;

    @ApiOperation(value = "上传文件")
    @PostMapping("/uploadFile")
    @ApiImplicitParam(name = "bucketName", value = "桶名", required = true, dataTypeClass = String.class)
    public String uploadFile(MultipartFile multipartFile, String bucketName) {
        return minIOService.uploadFile(multipartFile, bucketName);
    }

    @ApiOperation(value = "下载文件")
    @GetMapping("/downloadFile")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "bucketName", value = "桶名", required = true, dataTypeClass = String.class),
            @ApiImplicitParam(name = "filename", value = "文件名", required = true, dataTypeClass = String.class)
    })
    public void uploadFile(String bucketName, String filename) {
        minIOService.downloadFile(bucketName, filename);
    }

    @ApiOperation(value = "删除文件")
    @GetMapping("/deleteFile")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "bucketName", value = "桶名", required = true, dataTypeClass = String.class),
            @ApiImplicitParam(name = "filename", value = "文件名", required = true, dataTypeClass = String.class)
    })
    public boolean deleteFile(String bucketName, String filename) {
        return minIOService.deleteFile(bucketName, filename);
    }
}

MinIOService

public interface MinIOService {
    MinioClient connectMinIO();

    String uploadFile(MultipartFile multipartFile, String bucketName);

    String uploadFileInputStream(InputStream inputStream, String bucketName, String suffix, String contentType);

    void downloadFile(String bucketName, String fileName);

    boolean deleteFile(String bucketName, String filename);
}

MinIOServiceImpl

IOUtils使用以下包:

import org.apache.tomcat.util.http.fileupload.IOUtils;
@Service
public class MinIOServiceImpl implements MinIOService {

    @Value("${minio.url}")
    private String minioUrl;
    @Value("${minio.accessKey}")
    private String minioAccessKey;
    @Value("${minio.secretKey}")
    private String minioSecretKey;

    /**
     * 连接minio
     *
     * @return minioClient
     */
    @Override
    public MinioClient connectMinIO() {
        MinioClient minioClient = null;
        try {
            minioClient = new MinioClient(minioUrl, minioAccessKey, minioSecretKey);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return minioClient;
    }

    /**
     * 上传文件到minio
     *
     * @param multipartFile 文件
     * @param bucketName    桶名
     * @return 文件名
     */
    @Override
    public String uploadFile(MultipartFile multipartFile, String bucketName) {
        MinioClient minioClient = connectMinIO();
        String fileName = null;
        //查看桶名是否存在
        try {
            boolean bucketExists = minioClient.bucketExists(bucketName);
            if (!bucketExists) { //如果不存在,创建桶名
                minioClient.makeBucket(bucketName);
            }
            String filename = multipartFile.getOriginalFilename();
            assert filename != null;
            //获取文件后缀
            String suffix = filename.substring(filename.lastIndexOf("."));
            //创建新的文件名
            fileName = UUID.randomUUID() + suffix;
            //存储数据到minio
            minioClient.putObject(bucketName, fileName, multipartFile.getInputStream(), multipartFile.getSize(), multipartFile.getContentType());
        } catch (Exception e) {
            e.printStackTrace();
        }
        return fileName;
    }

    /**
     * 上传文件流到minio
     *
     * @param inputStream 文件流
     * @param bucketName  桶名
     * @return 文件名
     */
    @Override
    public String uploadFileInputStream(InputStream inputStream, String bucketName, String suffix, String contentType) {
        MinioClient minioClient = connectMinIO();
        String fileName = null;
        //查看桶名是否存在
        try {
            boolean bucketExists = minioClient.bucketExists(bucketName);
            if (!bucketExists) { //如果不存在,创建桶名
                minioClient.makeBucket(bucketName);
            }
            //创建新的文件名
            fileName = UUID.randomUUID() + suffix;
            //存储数据到minio
            minioClient.putObject(bucketName, fileName, inputStream, contentType);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return fileName;
    }

    /**
     * 下载文件
     *
     * @param bucketName 桶名
     * @param fileName   文件名
     */
    @Override
    public void downloadFile(String bucketName, String fileName) {
        MinioClient minioClient = connectMinIO();
        InputStream inputStream;
        try {
            inputStream = minioClient.getObject(bucketName, fileName);
            ToolUtils.response.setContentType("application/octet-stream");
            //下载需要设置文件名,负责没有文件后缀
            ToolUtils.response.addHeader("Content-Disposition", "attachment;filename=" + fileName);
            if (null != inputStream) IOUtils.copy(inputStream, ToolUtils.response.getOutputStream());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 删除文件
     *
     * @param bucketName 桶名
     * @param filename   文件名
     * @return 状态 成功true、则false
     */
    @Override
    public boolean deleteFile(String bucketName, String filename) {
        MinioClient minioClient = connectMinIO();
        boolean result = false;
        InputStream inputStream = null;
        try {
            inputStream = minioClient.getObject(bucketName, filename);
            if (null != inputStream) {
                inputStream.close();
                minioClient.removeObject(bucketName, filename);
                result = true;
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (null != inputStream) {
                try {
                    inputStream.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
        return result;
    }
}

ToolUtils工具

方便直接操作 HttpServletRequest、HttpServletResponse、session和cookie

@Component
public class ToolUtils {

    public static final int COOKIE_DEFAULT_TIME = 1;  //以秒为单位(1s)

    public static final int SESSION_DEFAULT_TIME = 1;  //以秒为单位(1s)

    public static HttpServletRequest request;

    public static HttpServletResponse response;

    public static HttpSession session;

    @Autowired
    private HttpServletResponse httpServletResponse;

    @Autowired
    private HttpServletRequest httpServletRequest;

    @Autowired
    private HttpSession httpSession;

    @PostConstruct
    public void beforeInit() {
        request = httpServletRequest;
        response = httpServletResponse;
        session = httpSession;
    }

    /**
     * 添加cookie
     *
     * @param key       名称
     * @param value     值
     * @param cookieAge 过期时间
     */
    public static void setCookie(String key, String value, int cookieAge) {
        if (key == null) {
            return;
        }
        if (value == null) {
            value = "";
        }

        Cookie cookie = new Cookie(key, value);
        cookie.setPath("/");
        if (cookieAge != 0) {
            cookie.setMaxAge(COOKIE_DEFAULT_TIME * cookieAge);
        } else {
            cookie.setMaxAge(COOKIE_DEFAULT_TIME);
        }
        response.addCookie(cookie);
        try {
            response.flushBuffer();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 获取cookie
     *
     * @param cookieName 名称
     * @return 值
     */
    public static String getCookie(String cookieName) {
        Cookie[] cookies = request.getCookies();
        String result = null;
        if (null != cookies && cookies.length > 0) {
            for (Cookie cookie : cookies) {
                if (cookie.getName().equals(cookieName)) {
                    result = cookie.getValue();
                    break;
                }
            }
        }
        return result;
    }

    /**
     * 删除cookie
     *
     * @param cookieName 名称
     * @return 结果
     */
    public static boolean removeCookie(String cookieName) {
        boolean result = false;
        if (null != cookieName) {
            Cookie cookie = new Cookie(cookieName, null);
            cookie.setMaxAge(0);
            cookie.setPath("/");
            cookie.setValue("");
            response.addCookie(cookie);
            result = true;
        }
        return result;
    }

    /**
     * 设置session
     *
     * @param key        键
     * @param value      值
     * @param sessionAge 过期时间
     */
    public static void setSession(String key, String value, int sessionAge) {
        if (key == null) {
            return;
        }
        if (value == null) {
            value = "";
        }
        session.setAttribute(key, value);
        if (sessionAge != 0) {
            session.setMaxInactiveInterval(COOKIE_DEFAULT_TIME * sessionAge);
        } else {
            session.setMaxInactiveInterval(SESSION_DEFAULT_TIME);
        }
    }

    /**
     * 获取session
     *
     * @param sessionName 键
     * @return 返回内容
     */
    public static String getSession(String sessionName) {
        Object attribute = session.getAttribute(sessionName);
        return null != attribute ? attribute.toString() : null;
    }

    /**
     * 删除session
     *
     * @param sessionName 键
     */
    public static void removeSession(String sessionName) {
        Object attribute = session.getAttribute(sessionName);
        if (null != attribute) {
            session.removeAttribute(sessionName);
        }
    }
}

以上代码亲测可用,如有问题欢迎留言;

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值