使用Minio技术 完成 文件上传 最全解析

Minio官网

MinIO | The MinIO Quickstart Guide

介绍:

MinIO是在GNU Affero通用公共许可证 v3.0 下发布的高性能对象存储,对象存储是支持海量用户远程访问的无限容量廉价存储系统。

它由桶(bucket),组成目录结构,桶中直接存放对象(Object),桶中不能再创建通,但是要能创建文件夹。

Minio下载地址

MinIO | Code and downloads to create high performance object storage

通过命令minio server ./data启动Minio

启动完成后,可以看到访问的路径http://127.0.0.1:9000,使用提供的账号密码进行登录

账号:minioadmin 密码:minioadmin

出现此界面说明登录成功,下面就可以创建桶了

Controller层:
/**
 * 通用请求处理
 */
@RestController
public class CommonController extends BaseController {
    private static final Logger log = LoggerFactory.getLogger(CommonController.class);

    @Autowired
    private ISysFileService fileService;


    /**
     * 通用上传请求
     */
    @PostMapping("/common/upload")
    public AjaxResult uploadFile(MultipartFile file){
        try{
            // 上传文件路径
            return fileService.upload(file);
        }catch (Exception e){
            return AjaxResult.error(e.getMessage());
        }
    }
}

业务层:


@Service
@Slf4j
public class SysFileServiceImpl implements ISysFileService {

    @Autowired
    MinioConfig minioConfig;

    /**
     * 文件上传至Minio
     * 使用try catch finally进行上传
     * finally里进行资源的回收
     */
    @Override
    public AjaxResult upload(MultipartFile file) {
        InputStream inputStream = null;

        MinioClient minioClient = getClient();//创建Minio的连接对象
        String bucketName = minioConfig.getBucketName(); //获取桶名

        try {
            inputStream = file.getInputStream();
            //判断桶是否存在
            boolean exists = minioClient.bucketExists(BucketExistsArgs.builder().bucket("桶名").build());
            if (!exists) {//不存在 则创建一个新的
                minioClient.makeBucket(MakeBucketArgs.builder().bucket("桶名").build());
            } else {
                log.info("bucketName '桶名' already Exists ");
            }
            /**
             * 思路:我们上传的文件是:***.pdf
             * 那么我们应该上传到配置的bucket内 我们配置的bucketName是--项目名
             * 并且放在 --项目名/年/月/日/这个目录下
             * 而对于同一个文件,存在重名问题,所以我们应该利用UUID生成一个新的文件名,并拼接上 .pdf 作为文件后缀
             * 那么完整的路径就是 --项目名/年/月/日/uuid.pdf
             */

            // 1. 文件名处理
            String fileName = file.getOriginalFilename();
            String objectName = new SimpleDateFormat("yyyy/MM/dd/").format(new Date())
                    + UUID.randomUUID().toString().replaceAll("-", "")
                    + fileName.substring(fileName.lastIndexOf("."));
            //2. 文件上传  参数校验 和分片上传
            PutObjectArgs objectArgs = PutObjectArgs.builder().object(objectName)
                    .bucket(bucketName)
                    .contentType(file.getContentType())
                    .stream(file.getInputStream(), file.getSize(), -1).build();
            minioClient.putObject(objectArgs);
            //3. 构建返回结果集,将文件名(fileName)和访问路径(url)返回
            AjaxResult ajax = AjaxResult.success();
            ajax.put("fileName", "/" + bucketName + "/" + objectName);

            ajax.put("url","http://"+ minioConfig.getEndpoint() + ":" + minioConfig.getPort()
                    + "/" + minioConfig.getBucketName() + "/" + objectName);
            //4. 将结果返回
            return ajax;
        } catch (Exception e) {
            e.printStackTrace();
            return AjaxResult.error("上传失败");
        } finally {
            if (inputStream != null) {
                try {
                    inputStream.close(); // 关闭流
                } catch (IOException e) {
                    log.debug("inputStream close IOException:" + e.getMessage());
                }
            }
        }
    }


    /**
     * 
     * 获取Minio连接
     *
     * @return
     */
    private MinioClient getClient() {
        MinioClient minioClient =
                MinioClient.builder()
                        .endpoint("http://" + minioConfig.getEndpoint() + ":" + minioConfig.getPort())
                        .credentials(minioConfig.getAccessKey(), minioConfig.getSecretKey())
                        .build();
        return minioClient;
    }
}

 运行之后,我们建的桶里就会出现刚才上传的文件了。。。。。。。。。。。。。。

  • 4
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

上官玺

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值