后端代码
<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
},
}