以往的项目,用的比较多的OSS服务是腾讯云和阿里云的存储服务,最近的几个项目,普遍要使用Minio,所以我在开发服务器和测试服务器上都装上了minio.
如果没用过docker的同学请先看我之前发的文章,已经讲解过如何安装docker
docker pull minio/minio
一个用来存放配置,一个用来存储上传文件的目录
启动前需要先创建Minio外部挂载的配置文件( /home/minio/config),和存储上传文件的目录( /home/minio/data)
mkdir -p /home/minio/config
mkdir -p /home/minio/data
docker run -p 9000:9000 -p 9099:9099 \
--net=bridge \
--name minio \
-d --restart=always \
-e "MINIO_ACCESS_KEY=fsp-manage" \
-e "MINIO_SECRET_KEY=springboot-fsp-manage" \
-v /home/minio/data:/data \
-v /home/minio/config:/root/.minio \
minio/minio server \
/data --console-address ":9099" -address ":9000"
!!注意:因为mobalXterm 连接虚拟机后,会占用9090端口作为web console,所以此处改变端口9099
fsp-manage 是UI控制台登录账户(运行minio后访问,http://192.168.64.138:9099/login)
springboot-fsp-manage 是UI控制台登录密码(运行minio后访问,http://192.168.64.138:9099/login)
“serverUrl” 为自己服务器(虚拟机) 用户名,密码如上述
Java入门 点击该链接跳转到gitee,即可查看整合springboot后的项目
@PostMapping(value = {"/admin/uploadFile","/web/uploadFile"})
@ApiOperation(value = "上传文件,支持批量上传")
@ApiImplicitParam(name = "files",value = "文件对象",dataType = "File")
public ApiResult uploadFile(@RequestParam("files") List<MultipartFile> files) {
log.info(files.toString());
if (CollectionUtils.isEmpty(files)) {
return ApiResult.error("未选择文件!");
}
List<MinioResponseDTO> MinioResponseDTOList = new ArrayList<>();
for (MultipartFile file : files) {
String originalFilename = file.getOriginalFilename();
// 获取文件拓展名
String extName = FileUtil.extName(originalFilename);
log.info("文件拓展名:" + extName);
// 生成新的文件名,存入到minio
long millSeconds = Instant.now().toEpochMilli();
String minioFileName = millSeconds + RandomStringUtils.randomNumeric(12) + "." + extName;
String contentType = file.getContentType();
log.info("文件mime:{}", contentType);
// 返回文件大小,单位字节
long size = file.getSize();
log.info("文件大小:" + size);
try {
String bucketName = minioConfig.getBucketName();
minioClientUtils.putObject(bucketName, file, minioFileName);
String fileUrl = minioClientUtils.getObjectUrl(bucketName, minioFileName);
MinioFile minioFile = new MinioFile();
minioFile.setOriginalFileName(originalFilename);
minioFile.setFileExtName(extName);
minioFile.setFileName(minioFileName);
minioFile.setFileSize(size);
minioFile.setMime(contentType);
minioFile.setIsDelete(NumberUtils.INTEGER_ZERO);
minioFile.setFileUrl(fileUrl);
boolean insert = minioFile.insert();
if (insert) {//文件地址写入数据库
MinioResponseDTO minioResponseDTO = new MinioResponseDTO();
minioResponseDTO.setFileId(minioFile.getId());
minioResponseDTO.setOriginalFileName(originalFilename);
minioResponseDTO.setFileUrl(fileUrl);
MinioResponseDTOList.add(minioResponseDTO);
}
} catch (Exception e) {
log.error("上传文件出错:{}", e);
return ApiResult.error("上传文件出错");
}
}
return ApiResult.success(MinioResponseDTOList);
}
@GetMapping("/getPicture")
public void downloadFile(@RequestParam("fileUrl") String fileUrl, HttpServletResponse response) throws IOException {
if (StringUtils.isBlank(fileUrl)){
response.setHeader("Content-type","text/html;charset=UTF-8");
String msg = "文件下载失败";
OutputStream ps = response.getOutputStream();
ps.write(msg.getBytes(StandardCharsets.UTF_8));
return;
}
try {
//拿到文件路径
String url = fileUrl.split("9000/")[1];
//获取文件对象
InputStream object = minioClientUtils.getObject(MinioConstant.FSP_DEV, url.substring(url.indexOf("/") + 1));
byte[] bytes = new byte[1024];
int len = 0;
response.reset();
response.setHeader("Content-Disposition","attachment/filename="+
URLEncoder.encode(url.substring(url.lastIndexOf("/")+1),"UTF-8"));
response.setContentType("application/octet-stream");
response.setCharacterEncoding("UTF-8");
OutputStream stream = response.getOutputStream();
while ((len = object.read(bytes))>0){
stream.write(bytes,0,len);
}
stream.close();
}catch (Exception e){
response.setHeader("Content-type","text/html;charset=UTF-8");
String data = "文件下载失败";
OutputStream ps = response.getOutputStream();
ps.write(data.getBytes(StandardCharsets.UTF_8));
}
}