Minio图片上传

本文介绍了如何在SpringBoot项目中集成MinIO库,包括配置MinIO客户端、处理文件上传与下载操作,以及使用MultipartFile和RESTfulAPI进行文件操作的示例。
摘要由CSDN通过智能技术生成

后端代码

<dependency>
    <groupId>io.minio</groupId>
    <artifactId>minio</artifactId>
    <version>7.0.2</version> <!-- 版本号可能会有更新 -->
</dependency>

MinIoConfig

package com.ruoyi.utils;

import io.minio.MinioClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MinioConfig {
    //桶的名称 -一定注意在minio中要存在
    public  static final String bucket="data";
    @Bean
    public MinioClient minioClient(){
        return MinioClient.builder()
                .endpoint("127.0.0.1",9000,false)
                .credentials("data","data").build();
    }
}

MinIoUtill

@Component
public class MinIOUtil {
    @Autowired
    private static MinioClient minioClient;
    /**
     * 捅名称
     */
    @Value("${minio.bucketName}")
    private static String bucketName;
 
    /**
     * putObject上传文件
     *
     * @param file 文件
     * @return filePath
     */
    public static String putObject(MultipartFile file) throws Exception{
        //文件名
        String originalFilename = file.getOriginalFilename();
        //文件流
        InputStream inputStream = file.getInputStream();
        //文件大小
        long size = file.getSize();
        //文件路径
        String filePath = createFilePath(originalFilename);
        System.out.println(filePath+"\t文件路径");
        //存储方法 putObject
        minioClient.putObject(PutObjectArgs.builder()
                .bucket(bucketName)
                .object(filePath)
                .stream(inputStream, size, -1)
                .contentType(file.getContentType())
                .build());
        return filePath;
    }
 
    /**
     * 下载文件
     *
     * @param filePath 文件路径
     */
    public void getObject(HttpServletResponse httpServletResponse, String filePath) throws IOException, InvalidKeyException, InvalidResponseException, InsufficientDataException, NoSuchAlgorithmException, ServerException, InternalException, XmlParserException, ErrorResponseException {
        String fileName = getFileName(filePath);
        InputStream inputStream = minioClient.getObject(GetObjectArgs.builder()
                .bucket(bucketName)
                .object(filePath)
                .build());
        downloadFile(httpServletResponse, inputStream, fileName);
    }
 
    /**
     * 获取文件路径
     *
     * @param originalFilename 原始文件名称
     * @return FilePath
     */
    public static String createFilePath(String originalFilename) {
        return new SimpleDateFormat("yyyy/MM/dd").format(new Date()) + "/" + originalFilename;
    }
 
    /**
     * 根据文件路径获取文件名称
     *
     * @param filePath 文件路径
     * @return 文件名
     */
    public String getFileName(String filePath) {
        String[] split = StringUtils.split(filePath, "/");
        return split[split.length - 1];
    }
 
    /**
     * 下载文件
     *
     * @param httpServletResponse httpServletResponse
     * @param inputStream         inputStream
     * @param fileName            文件名
     * @throws IOException IOException
     */
    public void downloadFile(HttpServletResponse httpServletResponse, InputStream inputStream, String fileName) throws IOException {
        //设置响应头信息,告诉前端浏览器下载文件
        httpServletResponse.setContentType("application/octet-stream;charset=UTF-8");
        httpServletResponse.setCharacterEncoding("UTF-8");
        httpServletResponse.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
        //获取输出流进行写入数据
        OutputStream outputStream = httpServletResponse.getOutputStream();
        // 将输入流复制到输出流
        byte[] buffer = new byte[4096];
        int bytesRead = -1;
        while ((bytesRead = inputStream.read(buffer)) != -1) {
            outputStream.write(buffer, 0, bytesRead);
        }
        // 关闭流资源
        inputStream.close();
        outputStream.close();
    }

上传工具包

public enum UploadEnum {

    //上传的工具包
    //MinIO 上传的图片,打开链接默认是下载的问题
    DEFAULT("default","application/octet-stream"),
    PNG("png", "image/png"),
    JPEG("jpeg", "image/jpeg"),
    JPG("jpg", "image/jpeg"),
    GIF("gif", "image/gif"),
    WBMP("wbmp", "image/vnd.wap.wbmp"),
    TIFF("tiff", "image/tiff"),
    JFIF("jfif", "image/jpeg"),
    TIF("tif", "image/tiff"),
    FAX("fax", "image/fax"),
    JPE("jpe", "image/jpeg"),
    NET("net", "image/pnetvue"),
    RP("rp", "image/vnd.rn-realpix"),
    ICO("ico", "image/x-icon");

    private String prefix;

    private String type;

    private static final Map<String, UploadEnum> ENUM_MAP = new HashMap<>();

    static {
        UploadEnum[] values = values();
        for (UploadEnum value : values) {
            ENUM_MAP.put(value.getPrefix(), value);
        }
    }

    public static String getTypeByPrefix(String prefix) {
        UploadEnum uploadEnum = ENUM_MAP.get(prefix);
        if (uploadEnum == null) {
            return prefix;
        }
        return uploadEnum.getType();
    }

    public static String getContentType(String prefix){
        if(StringUtils.isEmpty(prefix)){
            return DEFAULT.getType();
        }
        prefix = prefix.substring(prefix.lastIndexOf(".") + 1);
        String type = getTypeByPrefix(prefix);
        if (StringUtils.isNotEmpty(type)) {
            return type;
        }
        return DEFAULT.getType();
    }

    UploadEnum(String prefix, String type) {
        this.prefix = prefix;
        this.type = type;
    }

    public String getPrefix() {
        return prefix;
    }

    public String getType() {
        return type;
    }
}

前端

第二种

依赖

<!-- minio 相关依赖-->
<dependency>
    <groupId>io.minio</groupId>
    <artifactId>minio</artifactId>
    <version>8.2.2</version>
</dependency>
package com.cloud.controller; /**
 * @Author: YangZhiSen
 * @Date: 2021/12/14 9:58
 * @text: 文件上传到服务器
 */

import com.cloud.config.MinioConfig;
import io.minio.MinioClient;
import io.minio.PutObjectArgs;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
@RestController
@Slf4j
@CrossOrigin
@RequestMapping("upload")
public class FileController{
 @Autowired
 MinioClient minioClient;
 /**
  * minIo图片上传
  *
  * @param file
  * @return
  */
 @PostMapping("files")
 public Map<String, Object> upload(MultipartFile file) {
  HashMap<String, Object> map = new HashMap<>();
  //获取上传文件的原始文件名。
  String originalFilename = file.getOriginalFilename();
  try {
   //构建 PutObjectArgs 对象,用于指定上传到 MinIO 对象存储的参数,其中包括:
   //bucket("data"):指定存储桶名称为 "data"。
   //stream(file.getInputStream(), file.getSize(), -1):指定上传文件的输入流、大小和不限制分片大小。
   //contentType(file.getContentType()):指定上传文件的内容类型。
   PutObjectArgs putObjectArgs = PutObjectArgs.builder()
           .bucket("data")
           .object(originalFilename)
           .stream(file.getInputStream(), file.getSize(), -1)
           .contentType(file.getContentType())
           .build();
   //调用 MinIO 客户端的 putObject 方法将文件上传至 MinIO 对象存储。
   minioClient.putObject(putObjectArgs);
   //构建文件访问路径,并将路径放入返回的 map 中。
   String path = "http://localhost:9000/data/" + originalFilename;
   map.put("code", 200);
   map.put("msg", "附件上传成功");
   map.put("path", path);
   return map;
  } catch (Exception e) {
   e.printStackTrace();
   log.error("异常信息: ", e);
  }
  map.put("code", 200);
  map.put("msg", "附件上传失败");
  return map;
 }
}

config

package com.cloud.config;

import io.minio.MinioClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MinioConfig {

    @Bean
    public MinioClient minioClient(){
        return MinioClient.builder()
                .endpoint("http://localhost:9000")
                .credentials("minioadmin","minioadmin")
                .build();
    }
}


前端

 </el-form-item>
        <el-form-item
            label="评价附件"
            :label-width="formLabelWidth">
          <el-upload
              action="http://localhost:9898/upload/files"
              list-type="picture-card"
              :on-success="handlePictureCardPreview"
              :on-remove="handleRemove">
            <i class="el-icon-plus"></i>
          </el-upload>
          <el-dialog :visible.sync="dialogFormVisible4">
            <el-image :src="imgUrl" alt=""/>
          </el-dialog>
        </el-form-item>



data(){
return{
  imgUrl: '',
}


}methods(){

 handleRemove(file,fileList){
      console.log(file,fileList)
    },
    handlePictureCardPreview(res,file){
      this.imgUrl=URL.createObjectURL(file.raw)
      this.form3.img=res.path
    },


}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值