Java SpringCloud 微服务通过minio实现文件上传和文件下载接口

Java 投稿 70400 0 评论

Java SpringCloud 微服务通过minio实现文件上传和文件下载接口

文件上传功能

文件上传很简单,首先你得部署好minio,然后写好配置信息,我的是动态读取nacos上配置的yml

@Autowired    private MinioConfig minioConfig;    @Autowired    private MinioClient client;    @Autowired    private FileInfoMapper fileInfoMapper;

/**
* 本地文件上传接口
* @param file 上传的文件
* @return 访问地址
* @throws Exception
*/
@Override
public String uploadFile(MultipartFile file) throws Exception
{
String fileName = FileUploadUtils.extractFilename(file);
PutObjectArgs args = PutObjectArgs.builder()
.bucket(minioConfig.getBucketName())
.object(fileName)
.stream(file.getInputStream(), file.getSize(), -1)
.contentType(file.getContentType())
.build();
client.putObject(args);
return minioConfig.getUrl() + "/" + minioConfig.getBucketName() + "/" + fileName;
}
     /**
* 这个属于业务了,可以参考 * 文件存储路径: * 业务功能名文件夹+文件UUID+文件类型后缀 * @param file 上传的文件 * @param fileInfo 文件信息表:存储了上传标识等信息(用于区分各个微服务下的各个业务,后面可通过这个标识区分这文件是哪个业务的) * @return * @throws Exception */ @Override public int uploadFile(MultipartFile file, FileInfo fileInfo) throws Exception { //文件UUID String uuid= IdUtils.fastSimpleUUID(); //文件目录名称 String fileName = FileUploadUtils.extractFilenameByUuid(file, uuid); // 文件路径 String url = fileInfo.getSid()+ "/" + fileName; PutObjectArgs args = PutObjectArgs.builder() .bucket(minioConfig.getBucketName()) .object(fileInfo.getSid()+ "/" + fileName) .stream(file.getInputStream(), file.getSize(), -1) .contentType(file.getContentType()) .build(); client.putObject(args); //上传到minio后,将文件信息保存 fileInfo.setUid(uuid); fileInfo.setFileName(file.getOriginalFilename()); fileInfo.setFileSize(file.getSize()); fileInfo.setFileType(FileUploadUtils.getExtension(file)); fileInfo.setFilePath(url); fileInfo.setCreateBy(SecurityUtils.getUsername()); fileInfo.setCreateTime(DateUtils.getNowDate()); return fileInfoMapper.insertFileInfo(fileInfo); }

文件下载功能

这里遇到个理解错误的消息,minio提供的getObject方法和downloadObject方法:

1. getObject

GetObject接口用于获取某个文件(Object)。

此操作需要对此Object具有读权限。

获取对象的数据。

InputStream使用后返回必须关闭以释放网络资源。

2. downloadObject

将对象的数据下载到文件

下载主要参数是文件保存的目录地址,如:system/task/2022/05/11/daebcc866c7f4c7dad34c55b8abff687.png,而不是这样子的:http://192.168.8.116:9000/test/2022/05/11/logo_20220511103344A001.png

因为:http://192.168.1.1:9000/test/   minio会直接在这下面开始查,test为桶名称bucketName

业务层:

   @Autowired
    private MinioConfig minioConfig;

    @Autowired
    private MinioClient client;
    
    /**
     * 下载文件
     * @param fileName 下载目录地址 如:system/task/2022/05/11/daebcc866c7f4c7dad34c55b8abff687.png
     * @param outputStream http请求中的outputStream
     */
    @Override
    public void  download(String fileName, ServletOutputStream outputStream)
    {
        try (InputStream inputStream = client.getObject(GetObjectArgs
                .builder()
                .bucket(minioConfig.getBucketName())
                .object(fileName)
                .build()))
        {
            IOUtils.copy(inputStream, outputStream);
        }
        catch (Exception e)
        {
            log.error("文件下载异常");
            e.printStackTrace();
        }
    }

控制层

     /**
     * 下载文件
     * @param uid 文件uid
     * @param response
     * @throws Exception
     */
    @GetMapping("/download/{uid}")
    public void download(@PathVariable("uid") String uid,HttpServletResponse response) throws Exception
    {
        //根据文件UUID,查询文件表,得到文件路径目录
        String fileName = fileInfoService.selectFilePathById(uid);
        System.out.println(fileName);
        //调用业务层下载方法
        sysFileService.download(fileName,response.getOutputStream());
    }  

 

编程笔记 » Java SpringCloud 微服务通过minio实现文件上传和文件下载接口

赞同 (58) or 分享 (0)
游客 发表我的评论   换个身份
取消评论

表情
(0)个小伙伴在吐槽