写给大忙人看的 - Java中从MinIO服务器中下载文件(三)

川长思鸟来 2022-11-24 12:57 486阅读 0赞

前面两章介绍了 MinIO 文件服务器的环境搭建,以及在 Java 中上传文件至 MinIO 文件服务器中,现在,一起来看下如何从 MinIO 文件服务器中下载文件吧

1、获取文件对象

我们在 MinIO 工具类中,获取文件对象的方法,即获取文件的输入流对象

  1. /** * 获取文件 * * @param bucketName bucket名称 * @param objectName 文件名称 * @return 二进制流 */
  2. @SneakyThrows
  3. public InputStream getObject(String bucketName, String objectName) {
  4. return client.getObject(bucketName, objectName);
  5. }
  • bucketName,是指存储桶的名称
  • objectName,是指文件的路径,即存储桶下文件的相对路径

例如,图片的地址为

  1. http://127.0.0.1:9000/bucketName/20200806/1596681603481809.png

那么 objectName 就为

  1. 20200806/1596681603481809.png

2、下载文件

我们需要编写一个 API 来进行访问从而下载文件

  1. /** * 下载文件 * * @param fileUrl 文件绝对路径 * @param response * @throws IOException */
  2. @GetMapping("downloadFile")
  3. public void downloadFile(String fileUrl, HttpServletResponse response) throws IOException {
  4. if (StringUtils.isBlank(fileUrl)) {
  5. response.setHeader("Content-type", "text/html;charset=UTF-8");
  6. String data = "文件下载失败";
  7. OutputStream ps = response.getOutputStream();
  8. ps.write(data.getBytes("UTF-8"));
  9. return;
  10. }
  11. try {
  12. // 拿到文件路径
  13. String url = fileUrl.split("9000/")[1];
  14. // 获取文件对象
  15. InputStream object = minioUtils.getObject(MinioConst.MINIO_BUCKET, url.substring(url.indexOf("/") + 1));
  16. byte buf[] = new byte[1024];
  17. int length = 0;
  18. response.reset();
  19. response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(url.substring(url.lastIndexOf("/") + 1), "UTF-8"));
  20. response.setContentType("application/octet-stream");
  21. response.setCharacterEncoding("UTF-8");
  22. OutputStream outputStream = response.getOutputStream();
  23. // 输出文件
  24. while ((length = object.read(buf)) > 0) {
  25. outputStream.write(buf, 0, length);
  26. }
  27. // 关闭输出流
  28. outputStream.close();
  29. } catch (Exception ex) {
  30. response.setHeader("Content-type", "text/html;charset=UTF-8");
  31. String data = "文件下载失败";
  32. OutputStream ps = response.getOutputStream();
  33. ps.write(data.getBytes("UTF-8"));
  34. }
  35. }

这里传入的参数 fileUrl 为文件的绝对路径,即可以直接访问的路径,还需要通过此路径,截取得到文件的相对路径(即去掉 IP 地址和端口,去掉存储桶名称的路径)

3、测试

通过访问 API

  1. http://127.0.0.1/minio/downloadFile?fileUrl=http://127.0.0.1:9000/bucketName/20200806/1596681603481809.png

便能成功下载文件了

如您在阅读中发现不足,欢迎留言!!!

发表评论

表情:
评论列表 (有 0 条评论,486人围观)

还没有评论,来说两句吧...

相关阅读