文件服务器Minio安装和使用
1.Minio下载和安装
1.1minio下载
官网:MinIO | Code and downloads to create high performance object storageCode and downloads to create high-performance, infinitely scalable object storage systems for any production environment.
https://min.io/download#/windows
1.2启动minio服务
在minio.exe文件所在目录运行命令:minio.exe server 保存路径
cmd命令:
minio.exe server F:\software\minio\MinIoData
运行结果如下:

登录界面 输入账号/密码:minioadmin/minioadmin
1.3创建桶
记得设置为public公共的

1.4上传下载文件

http://192.168.5.135:9000/test11/AAAAAAAAAAAAA.JPG

2.minio的使用
2.1引入minio依赖
io.minio minio 7.1.0
2.2minio配置(application.yml)
# MinIo配置
minio:# endpoint: minio服务所在地址endpoint: http://192.168.5.188:9000# bucketName:存储桶名称accessKey: minioadmin# accessKey:访问的keysecretKey: minioadmin# secretKey:访问的秘钥bucketName: pvinspection
2.3Minio工具类
package com.projectname.common.framework.minio;import com.projectname.common.core.constant.Constants;
import com.projectname.common.core.exception.ServiceException;
import com.projectname.common.core.utils.DateUtils;
import io.minio.*;
import io.minio.messages.DeleteError;
import io.minio.messages.DeleteObject;
import lombok.SneakyThrows;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.util.FastByteArrayOutputStream;
import org.springframework.web.multipart.MultipartFile;import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.*;/*** Minio工具类** @author kally*/
@Configuration
public class MinioUtil {private final static Logger log = LoggerFactory.getLogger(MinioUtil.class);private MinioClient minioClient;@Value("${minio.endpoint}")private String url;@Value("${minio.secretKey}")private String accessKey;@Value("${minio.secretKey}")private String secretKey;@Value("${minio.bucketName}")private String bucketName;@Beanpublic MinioClient minioClient() {// Configure the builderMinioClient.Builder builder = MinioClient.builder();builder.endpoint(url);builder.credentials(accessKey, secretKey);// Init the builderthis.minioClient = builder.build();return builder.build();}@SneakyThrowsprivate boolean isBucketExist(String bucketName) {// Set the builderBucketExistsArgs.Builder builder = BucketExistsArgs.builder();builder.bucket(bucketName);BucketExistsArgs bucketExistsArgs = builder.build();boolean isExist = this.minioClient.bucketExists(bucketExistsArgs);if (isExist) {log.info("The bucket is exist! ");} else {minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());log.info("Create bucket is success! ");}return isExist;}@SneakyThrowspublic boolean uploadObject(String filename, String fileFullPath) {if (!this.isBucketExist(bucketName)) {return false;}UploadObjectArgs.Builder builder = UploadObjectArgs.builder();builder.bucket(bucketName);builder.object(filename);builder.filename(fileFullPath);UploadObjectArgs uploadObjectArgs = builder.build();this.minioClient.uploadObject(uploadObjectArgs);return true;}@SneakyThrowspublic String uploadObjectAndObjectUrl(String filename, String fileFullPath) {if (!this.isBucketExist(bucketName)) {throw new ServiceException("minio文件服务器:" + bucketName + " 桶不存在");}UploadObjectArgs.Builder builder = UploadObjectArgs.builder();builder.bucket(bucketName);builder.object(filename);builder.filename(fileFullPath);UploadObjectArgs uploadObjectArgs = builder.build();minioClient.uploadObject(uploadObjectArgs);return minioClient.getObjectUrl(bucketName, filename);}@SneakyThrowspublic String putObjectStream(MultipartFile file) {if (null == file || 0 == file.getSize()) {throw new ServiceException("上传minio文件服务器错误,上传文件为空");}if (!this.isBucketExist(bucketName)) {throw new ServiceException("minio文件服务器:" + bucketName + " 桶不存在");}String originalFilename = file.getOriginalFilename();assert originalFilename != null;long now = System.currentTimeMillis() / 1000;// TODO 后期多线程换成StringBufferStringBuilder fileNameBuilder = new StringBuilder();fileNameBuilder.append(DateUtils.parseDateToStr("yyyyMMdd", new Date())).append(Constants.UNDERSCORE).append(now).append(Constants.UNDERSCORE).append(new Random().nextInt(1000)).append(originalFilename.substring(originalFilename.lastIndexOf(".")));try {InputStream inputStream = file.getInputStream();minioClient.putObject(PutObjectArgs.builder().bucket(bucketName).object(fileNameBuilder.toString()).stream(inputStream, file.getSize(), -1).contentType(file.getContentType()).build());inputStream.close();return minioClient.getObjectUrl(bucketName, fileNameBuilder.toString());} catch (Exception e) {e.printStackTrace();}return null;}@SneakyThrowspublic boolean removeObject(String filename) {RemoveObjectArgs.Builder builder = RemoveObjectArgs.builder();builder.bucket(bucketName);builder.object(filename);RemoveObjectArgs removeObjectArgs = builder.build();this.minioClient.removeObject(removeObjectArgs);return true;}@SneakyThrowspublic boolean downloadObject(String filename, String saveFilePath) {DownloadObjectArgs.Builder builder = DownloadObjectArgs.builder();builder.bucket(bucketName);builder.object(filename);builder.filename(saveFilePath.concat(filename));DownloadObjectArgs downloadObjectArgs = builder.build();this.minioClient.downloadObject(downloadObjectArgs);log.info("Download {} file is success! ", filename);return true;}@SneakyThrowspublic boolean downloadGetObject(String filename, String saveFilePath) {if (!this.isBucketExist(bucketName)) {return false;}GetObjectArgs.Builder builder = GetObjectArgs.builder();builder.bucket(bucketName);builder.object(filename);GetObjectArgs objectArgs = builder.build();InputStream response = minioClient.getObject(objectArgs);// Read the byte stream of databyte[] buff = new byte[1024];FastByteArrayOutputStream fbaos = new FastByteArrayOutputStream();int len;while ((len = response.read(buff)) != -1) {fbaos.write(buff, 0, len);}fbaos.flush();// Create the fileFile file = new File(saveFilePath.concat(filename));if (!file.exists()) {file.createNewFile();}// Write the fileOutputStream outputStream = new FileOutputStream(file);outputStream.write(fbaos.toByteArray());outputStream.flush();fbaos.close();log.info("Download {} file is success! ", filename);return true;}@SneakyThrowspublic void deleteMultiObject(List objects) {RemoveObjectsArgs.Builder builder = RemoveObjectsArgs.builder();builder.bucket(bucketName);builder.objects(objects);RemoveObjectsArgs removeObjectsArgs = builder.build();Iterable> results = this.minioClient.removeObjects(removeObjectsArgs);for (Result result : results) {DeleteError error = result.get();log.info("Error in deleting object {}; {}", error.objectName(), error.message());}}public static void main(String[] args) {// 1、minio上传
// String filename = "1122.doc";
// String fileFullPath = "C:\\Users\\lenovo\\Desktop\\1122.doc";
// MinioUtil minio = new MinioUtil();
// minio.uploadObject(filename, fileFullPath);// 2、minio下载[不存在时创建,存在时更新]
// String filename = "1122.doc";
// String saveFilePath = "C:\\Users\\lenovo\\Desktop\\202207minio\\";
// minio.downloadGetObject(filename, saveFilePath);// 2.2、minio下载
// minio.downloadObject(filename, saveFilePath);// 3、移除文件
// String filename = "1122.doc";
// minio.removeObject(filename);// 多文件移除
// List objects = new LinkedList<>();
// objects.add(new DeleteObject("任务巡检.png"));
// objects.add(new DeleteObject("1122.doc"));
// minio.deleteMultiObject(objects);}}
2.4Controller层实现
package com.projectname.api.cotroller.common;import com.projectname.common.core.config.WindPvElecIntgConfig;
import com.projectname.common.core.constant.Constants;
import com.projectname.common.core.exception.ServiceException;
import com.projectname.common.core.utils.StringUtils;
import com.projectname.common.core.utils.file.FileUploadUtils;
import com.projectname.common.core.utils.file.FileUtils;
import com.projectname.common.core.baseweb.domain.AjaxResult;
import com.projectname.common.framework.application.ServerConfig;
import com.projectname.common.framework.minio.MinioUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.List;/*** 通用请求处理*/
@RestController
@RequestMapping("/common")
@Api(tags = "通用请求接口")
public class CommonController {private static final Logger log = LoggerFactory.getLogger(CommonController.class);@Autowiredprivate ServerConfig serverConfig;@Autowiredprivate MinioUtil minioUtil;private static final String FILE_DELIMETER = ",";/*** 通用下载请求** @param fileName 文件名称* @param delete 是否删除*/@GetMapping("/download")public void fileDownload(String fileName, Boolean delete, HttpServletResponse response, HttpServletRequest request) {try {if (!FileUtils.checkAllowDownload(fileName)) {throw new Exception(StringUtils.format("文件名称({})非法,不允许下载。 ", fileName));}String realFileName = System.currentTimeMillis() + fileName.substring(fileName.indexOf("_") + 1);String filePath = WindPvElecIntgConfig.getDownloadPath() + fileName;response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);FileUtils.setAttachmentResponseHeader(response, realFileName);FileUtils.writeBytes(filePath, response.getOutputStream());if (delete) {FileUtils.deleteFile(filePath);}} catch (Exception e) {log.error("下载文件失败", e);}}/*** 通用上传请求(单个)*/@PostMapping("/upload")public AjaxResult uploadFile(MultipartFile file) throws Exception {try {// 上传文件路径String filePath = WindPvElecIntgConfig.getUploadPath();// 上传并返回新文件名称String fileName = FileUploadUtils.upload(filePath, file);String url = serverConfig.getUrl() + fileName;AjaxResult ajax = AjaxResult.success();ajax.put("url", url);ajax.put("fileName", fileName);ajax.put("newFileName", FileUtils.getName(fileName));ajax.put("originalFilename", file.getOriginalFilename());return ajax;} catch (Exception e) {return AjaxResult.error(e.getMessage());}}/*** 通用上传请求(多个)*/@PostMapping("/uploads")public AjaxResult uploadFiles(List files) throws Exception {try {// 上传文件路径String filePath = WindPvElecIntgConfig.getUploadPath();List urls = new ArrayList();List fileNames = new ArrayList();List newFileNames = new ArrayList();List originalFilenames = new ArrayList();for (MultipartFile file : files) {// 上传并返回新文件名称String fileName = FileUploadUtils.upload(filePath, file);String url = serverConfig.getUrl() + fileName;urls.add(url);fileNames.add(fileName);newFileNames.add(FileUtils.getName(fileName));originalFilenames.add(file.getOriginalFilename());}AjaxResult ajax = AjaxResult.success();ajax.put("urls", StringUtils.join(urls, FILE_DELIMETER));ajax.put("fileNames", StringUtils.join(fileNames, FILE_DELIMETER));ajax.put("newFileNames", StringUtils.join(newFileNames, FILE_DELIMETER));ajax.put("originalFilenames", StringUtils.join(originalFilenames, FILE_DELIMETER));return ajax;} catch (Exception e) {return AjaxResult.error(e.getMessage());}}/*** 本地资源通用下载*/@GetMapping("/download/resource")public void resourceDownload(String resource, HttpServletRequest request, HttpServletResponse response)throws Exception {try {if (!FileUtils.checkAllowDownload(resource)) {throw new Exception(StringUtils.format("资源文件({})非法,不允许下载。 ", resource));}// 本地资源路径String localPath = WindPvElecIntgConfig.getProfile();// 数据库资源地址String downloadPath = localPath + StringUtils.substringAfter(resource, Constants.RESOURCE_PREFIX);// 下载名称String downloadName = StringUtils.substringAfterLast(downloadPath, "/");response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);FileUtils.setAttachmentResponseHeader(response, downloadName);FileUtils.writeBytes(downloadPath, response.getOutputStream());} catch (Exception e) {log.error("下载文件失败", e);}}/*** 通用上传minio服务器请求(单个)*/@ApiOperation("通用上传minio服务器请求(单个)")@PostMapping("/uploadMinio")public AjaxResult uploadFileToMinio(MultipartFile file) throws Exception {try {String objectUrl = minioUtil.putObjectStream(file);return AjaxResult.success().put("url", objectUrl);} catch (Exception e) {log.error("minio上传文件失败", e);return AjaxResult.error(e.getMessage());}}/*** 通用删除minio服务器文件(单个)*/@ApiOperation("通用删除minio服务器文件(单个)")@DeleteMapping("/deleteMinioFile")public AjaxResult deleteMinioFile(String fileUrl) throws Exception {try {// 截取当前存放路径的 objectNameString objectName = FileUtils.getName(fileUrl);boolean removeObjectFlag = minioUtil.removeObject(objectName);if (!removeObjectFlag) {log.error("删除文件失败");throw new ServiceException("删除文件失败");}return AjaxResult.success();} catch (Exception e) {log.error("删除文件失败", e);return AjaxResult.error(e.getMessage());}}}
小伙伴们,赶快动起手来~这个文件服务实在是太好用了,不区分系统,Linux和Windows系统都能使用,很方便哦!
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
