minio实现文件上传下载和删除功能

x33g5p2x  于2021-12-23 转载在 其他  
字(3.3k)|赞(0)|评价(0)|浏览(867)

前言

之前用到文件上传功能,在这里做个学习记录。使用minio实现,后面会记录使用fastdfs和阿里云的oss实现文件上传以及他们的比较(oss根据流量收费)。minio的中文文档:https://docs.min.io/cn/

minio安装

  1. 首先查询docker镜像:
    docker search minio

  1. 选着stars最高的那个拉取:
    docker pull minio/minio

  1. 启动minio服务器,并设置端口号,容器名,账号和密码:
    docker run -p 9000:9000 --name minio -e MINIO_ACCESS_KEY=tanchuntcc -e MINIO_SECRET_KEY=tanchuntcc -v /data:/data minio/minio server /data

minio操作

  1. 启动成功后,访问你minio的ip地址,这里我docker安装在本机,所以是http://localhost:9000,输入刚刚设置的账号密码。

  1. 登陆后右下角可以创建bucket.

  1. 创建多个bucket后

  1. 可以选择编辑和删除

  1. 可以点击右下角上传文件

  1. 支持各种类型的文件:

Java客户端

首先创建一个Springboot项目,在resources中的application.yml文件添加如下配置:

  1. server:
  2. port: 8080
  3. spring:
  4. servlet:
  5. multipart:
  6. enabled: true #开启文件上传
  7. max-file-size: 500MB
  8. max-request-size: 500MB
  9. minio:
  10. endpoint: http://localhost:9000 #Minio服务所在地址
  11. bucketName: tcc #存储桶名称
  12. accessKey: tanchuntcc #访问的key
  13. secretKey: tanchuntcc #访问的秘钥

添加minio的maven依赖:

  1. <dependency>
  2. <groupId>io.minio</groupId>
  3. <artifactId>minio</artifactId>
  4. <version>3.0.10</version>
  5. </dependency>

controller的代码如下:

  1. @RestController("/minioDemo")
  2. public class MinioDemoController {
  3. private static final Logger LOGGER = LoggerFactory.getLogger(MinioDemoController.class);
  4. @Value("${minio.endpoint}")
  5. private String ENDPOINT;
  6. @Value("${minio.bucketName}")
  7. private String BUCKETNAME;
  8. @Value("${minio.accessKey}")
  9. private String ACCESSKEY;
  10. @Value("${minio.secretKey}")
  11. private String SECRETKEY;
  12. //文件创建
  13. @PostMapping
  14. public String upload(MultipartFile file) {
  15. String s=null;
  16. try {
  17. MinioClient minioClient = new MinioClient(ENDPOINT, ACCESSKEY, SECRETKEY);
  18. //存入bucket不存在则创建,并设置为只读
  19. if (!minioClient.bucketExists(BUCKETNAME)) {
  20. minioClient.makeBucket(BUCKETNAME);
  21. minioClient.setBucketPolicy(BUCKETNAME, "*.*", PolicyType.READ_ONLY);
  22. }
  23. String filename = file.getOriginalFilename();
  24. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
  25. // 文件存储的目录结构
  26. String objectName = sdf.format(new Date()) + "/" + filename;
  27. // 存储文件
  28. minioClient.putObject(BUCKETNAME, objectName, file.getInputStream(), file.getContentType());
  29. LOGGER.info("文件上传成功!");
  30. s=ENDPOINT + "/" + BUCKETNAME + "/" + objectName;
  31. } catch (Exception e) {
  32. LOGGER.info("上传发生错误: {}!", e.getMessage());
  33. }
  34. return s;
  35. }
  36. //文件删除
  37. @DeleteMapping
  38. public String delete(String name) {
  39. try {
  40. MinioClient minioClient = new MinioClient(ENDPOINT, ACCESSKEY, SECRETKEY);
  41. minioClient.removeObject(BUCKETNAME, name);
  42. } catch (Exception e) {
  43. return "删除失败"+e.getMessage();
  44. }
  45. return "删除成功";
  46. }
  47. }
  48. @GetMapping
  49. public void downloadFiles(@RequestParam("filename") String filename, HttpServletResponse httpResponse) {
  50. try {
  51. MinioClient minioClient = new MinioClient(ENDPOINT, ACCESSKEY, SECRETKEY);
  52. InputStream object = minioClient.getObject(BUCKETNAME, filename);
  53. byte buf[] = new byte[1024];
  54. int length = 0;
  55. httpResponse.reset();
  56. httpResponse.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(filename, "UTF-8"));
  57. httpResponse.setContentType("application/octet-stream");
  58. httpResponse.setCharacterEncoding("utf-8");
  59. OutputStream outputStream = httpResponse.getOutputStream();
  60. while ((length = object.read(buf)) > 0) {
  61. outputStream.write(buf, 0, length);
  62. }
  63. outputStream.close();
  64. } catch (Exception ex) {
  65. LOGGER.info("导出失败:", ex.getMessage());
  66. }
  67. }

编写好demo程序后使用postman进行测试:使用postman文件上传时选择body中的form-data选项,然后属性栏里面选择file属性就可以实现文件上传了。

删除文件时输入文件的相对路径即可删除:

导出文件时填好文件名称,选择save and download即可在postman中导出文件:

相关文章