maven仓库添加minio:
<dependency> <groupId>io.minio</groupId> <artifactId>minio</artifactId> <version>8.2.2</version> </dependency>
配置文件
提示:在项目的application.yml配置文件添加minio的连接信息。
#文件服务器
minio:
#api地址
endpoint: http://127.0.0.1:9001
#密钥
accessKey: minioadmin
#密钥
secretKey: minioadmin
#桶名称
bucketName: xxxx
代码
提示:这里提供一些操作minio的代码,包括(multipartFile、inputstream的操作)。可以直接调用或者加以完善。
配置类
@Data
@Configuration
@ConfigurationProperties(prefix="minio")
public class MinIoConfig {
/**
* 访问密钥
*/
@Value("${minio.accessKey}")
private String accessKey;
/**
* 密钥
*/
@Value("${minio.secretKey}")
private String secretKey;
/**
* 访问api Url
*/
@Value("${minio.endpoint}")
private String endpoint;
/**
* 捅名称
*/
@Value("${minio.bucketName}")
private String bucketName;
/**
* 创建MinIo客户端
*
* @return
*/
@Bean
public MinioClient minioClient() {
return MinioClient.builder()
.endpoint(endpoint)
.credentials(accessKey, secretKey)
.build();
}
}
通用方法MinIOUtil类
import io.minio.*;
import io.minio.errors.*;
import lombok.Cleanup;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
@Component
@Slf4j
public class MinIOUtil {
@Autowired
private MinioClient minioClient;
/**
* 捅名称
*/
@Value("${minio.bucketName}")
private String bucketName;
@Value("${minio.endpoint}")
private String endpoint;
@Value("${minio.accessKey}")
private String accessKey;
@Value("${minio.secretKey}")
private String secretKey;
public String getBucketName(){
return bucketName;
}
public String getEndpoint(){
return endpoint;
}
public String getAccessKey(){
return accessKey;
}
public String getSecretKey(){
return secretKey;
}
/**
* putObject上传文件
*
* @param file 文件
* @return filePath
*/
public Map<String, String> putObject(MultipartFile file) throws IOException, ServerException, InsufficientDataException, InternalException, InvalidResponseException, InvalidKeyException, NoSuchAlgorithmException, XmlParserException, ErrorResponseException {
//文件名
String originalFilename = file.getOriginalFilename();
//文件流
@Cleanup
InputStream inputStream = file.getInputStream();
//文件大小
long size = file.getSize();
//文件路径
String filePath = createFilePath(originalFilename);
//存储方法 putObject
minioClient.putObject(PutObjectArgs.builder()
.bucket(bucketName)
.object(filePath)
.stream(inputStream, size, -1)
.contentType(file.getContentType())
.build());
HashMap<String, String> result = new HashMap<>();
result.put("filePath", filePath);
result.put("fileUrl", endpoint + "/" + bucketName + "/" + filePath);
result.put("fileName", getFileName(filePath));
return result;
}
public Map<String, String> putObject(String fileCatalogue, MultipartFile file, String fileName) throws IOException, ServerException, InsufficientDataException, InternalException, InvalidResponseException, InvalidKeyException, NoSuchAlgorithmException, XmlParserException, ErrorResponseException {
//文件流
@Cleanup
InputStream inputStream = file.getInputStream();
//文件大小
long size = file.getSize();
//文件路径
String filePath = createFilePath(fileCatalogue,fileName);
//存储方法 putObject
minioClient.putObject(PutObjectArgs.builder()
.bucket(bucketName)
.object(filePath)
.stream(inputStream, size, -1)
.contentType(file.getContentType())
.build());
HashMap<String, String> result = new HashMap<>();
result.put("filePath", filePath);
result.put("fileUrl", endpoint + "/" + bucketName + "/" + filePath);
result.put("fileName", getFileName(filePath));
return result;
}
/**
* 上传xlsx格式的Excel
*
* @param inputStream
* @param fileName
* @return
*/
public Map<String, String> putXlsxExcelByStream(String fileCatalogue, InputStream inputStream, String fileName) throws IOException, ServerException, InsufficientDataException, InternalException, InvalidResponseException, InvalidKeyException, NoSuchAlgorithmException, XmlParserException, ErrorResponseException {
//文件大小
//byte[] bytes = IOUtils.toByteArray(inputStream);
//int length = bytes.length;
long size = inputStream.available();
//文件路径
String filePath = createFilePath(fileCatalogue,fileName);
//存储方法 putObject
minioClient.putObject(PutObjectArgs.builder()
.bucket(bucketName)
.object(filePath)
.stream(inputStream, size, -1)
.contentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
.build());
HashMap<String, String> result = new HashMap<>();
result.put("filePath", filePath);
result.put("fileUrl", endpoint + "/" + bucketName + "/" + filePath);
result.put("fileName", getFileName(filePath));
return result;
}
/**
* 下载文件
*
* @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 String createFilePath(String originalFilename) {
return new SimpleDateFormat("yyyy/MM/dd").format(new Date()) + "/" + originalFilename;
}
/**
* 获取文件路径
* fileCatalogue 文件目录
* @param originalFilename 原始文件名称
* @return FilePath
*/
public String createFilePath(String fileCatalogue, String originalFilename) {
return fileCatalogue + "/" + 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();
}
/**
* 通过路径获取文件流
*
* @param filePath 文件路径
* @return
*/
public InputStream getFileInputStream(String filePath) {
InputStream stream = null;
try {
StatObjectResponse statObjectResponse =
minioClient.statObject(StatObjectArgs.builder().bucket(bucketName).object(filePath).build());
// //以流的形式获取一个文件对象
if (statObjectResponse != null && statObjectResponse.size() > 0) {
stream = minioClient.getObject(
GetObjectArgs.builder()
.bucket(bucketName)
.object(filePath)
.build());
}
} catch (Exception e) {
e.printStackTrace();
}
return stream;
}
/**
* 通过url获取文件流
*
* @param filePath 文件路径
* @return
*/
public InputStream getFileInputStreamByUrl(String filePath) {
InputStream stream = null;
try {
URL url = new URL(endpoint + "/" + bucketName + "/" + filePath);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
stream = connection.getInputStream();
} catch (Exception e) {
log.error("通过url获取文件流异常:" + e.getMessage());
}
return stream;
}
/**
* 删除文件
*
* @param filePath 文件路径
* @return
*/
public void removeFile(String filePath) {
try {
//判断桶是否存在
boolean res = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
if (res) {
//删除文件
minioClient.removeObject(RemoveObjectArgs.builder()
.bucket(bucketName)
.object(filePath)
.build());
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
Controller层代码:
提示:这里提供上传和下载并且与前端交互的代码。
import com.alibaba.fastjson2.JSON;
import com.ruoyi.common.constant.HttpStatus;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.utils.MinIOUtil;
import com.ruoyi.common.utils.ServletUtils;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
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 javax.servlet.http.HttpServletResponse;
import java.util.Map;
@Api(value = "MinioController", tags = {"MinIO文件系统"})
@RestController
@RequestMapping("/dataCollect/minio")
@Slf4j
public class MinioController {
@Autowired
private MinIOUtil minioUtil;
@ApiOperation("上传")
@PostMapping("/upload")
public AjaxResult upload(@RequestPart MultipartFile file) {
Map<String,String> result;
try {
result = minioUtil.putObject(file);
} catch (Exception e) {
e.printStackTrace();
return AjaxResult.error("上传失败");
}
return AjaxResult.success(result);
}
@ApiOperation("下载")
@GetMapping("/download")
public void download(HttpServletResponse response, @ApiParam(name = "filepath", value = "文件路径", required = true) String filepath) {
try {
minioUtil.getObject(response, filepath);
} catch (Exception e) {
e.printStackTrace();
log.error("下载失败", e);
response.reset();
AjaxResult result = new AjaxResult(HttpStatus.ERROR, e.getMessage());
String json = JSON.toJSONString(result);
ServletUtils.renderString(response, json);
}
}
}