springmvc项目集成minio
springmvc项目如何集成minio
1.是导入相关依赖
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>8.0.3</version>
</dependency>
2.创建minio的配置文件
minio.url=http://xxx.xxx.xxx.xxx:xxxx
minio.username=xxx
minio.password=xxx
minio.bucketName=xxx
minio.address=xxx
3.配置minio的配置类
public class MinioConfig {
public MinioClient getMinioClient() {
Map<String, String> map = propertiesToMap("minio");
String url = map.get("minio.url");
String username = map.get("minio.username");
String password = map.get("minio.password");
System.out.println("执行了MinioConfig.getMinioClient" + url);
MinioClient minioClient = MinioClient.builder().endpoint(url)
.credentials(username, password).build();
return minioClient;
}
public Map<String, String> propertiesToMap(String properties) {
// 获得资源包
ResourceBundle bundle = ResourceBundle.getBundle(properties);
// 通过资源包拿到所有的名称
Enumeration<String> allName = bundle.getKeys();
Map<String, String> map= new HashMap();
// 遍历
while (allName.hasMoreElements()) {
// 获取每一个名称
String name = (String) allName.nextElement();
// 利用已得到的名称通过资源包获得相应的值
String value = bundle.getString(name);
map.put(name, value);
}
return map;
}
}
4.最后提供一下工具类
public class MinioUtils {
private static Logger log = LogManager.getLogger(LogManager.ROOT_LOGGER_NAME);
private static String bucketName;
private static String address;
private static MinioClient minioClient;
private static final Logger logger = LogManager.getLogger(TotalQueryController.class);
static{
MinioConfig minioConfig = new MinioConfig();
minioClient = minioConfig.getMinioClient();
Map<String, String> map = minioConfig.propertiesToMap("minio");
bucketName = map.get("minio.bucketName");
address = map.get("minio.address");
}
/**
* 查看存储bucket是否存在
* @return boolean
*/
public static Boolean bucketExists(String bucketName) {
//MinioClient minioClient = getMinioClient();
Boolean found;
try {
found = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
} catch (Exception e) {
//e.printStackTrace();
return false;
}
return found;
}
/**
* 创建存储bucket
* @return Boolean
*/
public static Boolean makeBucket(String bucketName) {
//MinioClient minioClient = getMinioClient();
try {
minioClient.makeBucket(MakeBucketArgs.builder()
.bucket(bucketName)
.build());
} catch (Exception e) {
e.printStackTrace();
logger.error("创建存储bucket时出现异常...",e);
return false;
}
return true;
}
/**
* 删除存储bucket
* @return Boolean
*/
public static Boolean removeBucket(String bucketName) {
//MinioClient minioClient = getMinioClient();
try {
minioClient.removeBucket(RemoveBucketArgs.builder()
.bucket(bucketName)
.build());
} catch (Exception e) {
e.printStackTrace();
logger.error("删除存储bucket时出现异常...",e);
return false;
}
return true;
}
/**
* 获取全部bucket
*/
public static List<Bucket> getAllBuckets() {
//MinioClient minioClient = getMinioClient();
try {
return minioClient.listBuckets();
} catch (Exception e) {
e.printStackTrace();
logger.error("获取存储bucket时出现异常...",e);
}
return null;
}
/**
* 文件上传
* @param file 文件
* @return Boolean
*/
public static String upload(MultipartFile file) {
//MinioClient minioClient = getMinioClient();
// 修饰过的文件名 非源文件名
logger.info("执行了upload");
StringBuilder fileName = new StringBuilder();
ExecutorService threadPool = Executors.newFixedThreadPool(5);
InputStream inputStream = null;
Date dd=new Date();
//格式化
SimpleDateFormat simTime =new SimpleDateFormat("yyyy/MM/dd");
String time=simTime.format(dd);
//拼接字符串为了实现分片
fileName = fileName.append(address).append("/").append(time)
.append("/").append(file.getOriginalFilename());
File toFile = multipartFileToFile(file);
//判断文件是否是pdf文件,如果是pdf文件,那么将contentType = "application/pdf",不这样做预览会出现问题
String temp = fileName.toString();
String str1 = temp.substring(0, temp.indexOf("."));
String name = temp.substring(str1.length()+1, temp.length());
String contentType = file.getContentType();
if("pdf".equals(name)){
contentType = "application/pdf";
}
try {
inputStream = new FileInputStream(toFile);
} catch (IOException e) {
e.printStackTrace();
}
try {
PutObjectArgs objectArgs = PutObjectArgs.builder().bucket(bucketName).object(fileName.toString())
.stream(inputStream,file.getSize(),-1).contentType(contentType).build();
//文件名称相同会覆盖
minioClient.putObject(objectArgs);
} catch (Exception e) {
e.printStackTrace();
logger.error("文件上传时出现异常...",e);
}
return fileName.toString();
}
/**
* 预览图片
* @param fileName
* @return
*/
public static String preview(String fileName){
//MinioClient minioClient = getMinioClient();
// 查看文件地址
GetPresignedObjectUrlArgs build = new GetPresignedObjectUrlArgs().builder().bucket(bucketName).object(fileName).method(Method.GET).build();
try {
String url = minioClient.getPresignedObjectUrl(build);
return url;
} catch (Exception e) {
e.printStackTrace();
logger.error("预览图片时出现异常...",e);
}
return null;
}
/**
* 文件下载
* @param fileName 文件名称
* @param res response
* @return Boolean
*/
public static void download(String fileName, HttpServletResponse res) {
//MinioClient minioClient = getMinioClient();
GetObjectArgs objectArgs = GetObjectArgs.builder().bucket(bucketName)
.object(fileName).build();
try (GetObjectResponse response = minioClient.getObject(objectArgs)){
byte[] buf = new byte[1024];
int len;
try (FastByteArrayOutputStream os = new FastByteArrayOutputStream()){
while ((len=response.read(buf))!=-1){
os.write(buf,0,len);
}
os.flush();
byte[] bytes = os.toByteArray();
res.setCharacterEncoding("utf-8");
//设置强制下载不打开
//res.setContentType("application/force-download");
res.addHeader("Content-Disposition", "attachment;fileName=" + fileName);
try (ServletOutputStream stream = res.getOutputStream()){
stream.write(bytes);
stream.flush();
}
}
} catch (Exception e) {
e.printStackTrace();
logger.error("文件下载时出现异常...",e);
}
}
/**
* 查看文件对象
* @return 存储bucket内文件对象信息
*/
public static List<Item> listObjects() {
//MinioClient minioClient = getMinioClient();
Iterable<Result<Item>> results = minioClient.listObjects(
ListObjectsArgs.builder().bucket(bucketName).build());
List<Item> items = new ArrayList<>();
try {
for (Result<Item> result : results) {
items.add(result.get());
}
} catch (Exception e) {
e.printStackTrace();
logger.error("查看文件对象时出现异常...",e);
return null;
}
return items;
}
/**
* 删除相关附件
* @param fileName:文件名称
* @return
* @throws Exception
*/
public static boolean remove(String fileName){
//MinioClient minioClient = getMinioClient();
try {
minioClient.removeObject( RemoveObjectArgs.builder().bucket(bucketName).object(fileName).build());
}catch (Exception e){
logger.error("删除相关附件时出现异常...",e);
return false;
}
return true;
}
/**
* 批量删除文件对象(没测试)
* @param objects 对象名称集合
*/
public static Iterable<Result<DeleteError>> removeObjects(List<String> objects) {
//MinioClient minioClient = getMinioClient();
List<DeleteObject> dos = objects.stream().map(e -> new DeleteObject(e)).collect(Collectors.toList());
Iterable<Result<DeleteError>> results = minioClient.removeObjects(RemoveObjectsArgs.builder().bucket(bucketName).objects(dos).build());
return results;
}
/**
*
* @Description 返回MultipartFile文件
* @return org.springframework.web.multipart.MultipartFile
* @date 2019/1/5 11:08
* @auther dell
*/
public static MultipartFile getFile(String filePath, String copyFile) throws IOException {
File file = new File(filePath);
FileItem fileItem = new DiskFileItem(copyFile, Files.probeContentType(file.toPath()),false,file.getName(),(int)file.length(),file.getParentFile());
byte[] buffer = new byte[4096];
int n;
try (InputStream inputStream = new FileInputStream(file); OutputStream os = fileItem.getOutputStream()){
while ( (n = inputStream.read(buffer,0,4096)) != -1){
os.write(buffer,0,n);
}
//也可以用IOUtils.copy(inputStream,os);
MultipartFile multipartFile = new CommonsMultipartFile(fileItem);
System.out.println(multipartFile.getName());
return multipartFile;
}catch (IOException e){
logger.error("返回MultipartFile文件时出现异常...",e);
e.printStackTrace();
}
return null;
}
public static Map<String, String> propertiesToMap(String properties) {
// 获得资源包
ResourceBundle bundle = ResourceBundle.getBundle(properties);
// 通过资源包拿到所有的名称
Enumeration<String> allName = bundle.getKeys();
Map<String, String> map= new HashMap();
// 遍历
while (allName.hasMoreElements()) {
// 获取每一个名称
String name = (String) allName.nextElement();
// 利用已得到的名称通过资源包获得相应的值
String value = bundle.getString(name);
map.put(name, value);
}
return map;
}
/**
* MultipartFile装换成File文件
* @param multiFile
* @return
*/
public static File multipartFileToFile(MultipartFile multiFile) {
// 获取文件名
String fileName = multiFile.getOriginalFilename();
// 获取文件后缀
String prefix = fileName.substring(fileName.lastIndexOf("."));
// 若须要防止生成的临时文件重复,能够在文件名后添加随机码
try {
File file = File.createTempFile(fileName, prefix);
multiFile.transferTo(file);
return file;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public static void deleteFileToName(String fileName){
File file=new File(fileName); //要删除的路径
deleteFile(file); //调用删除文件方法
}
/**
* 删除暂存在tomcat中的附件
* @param file
*/
private static void deleteFile(File file){
if (file.exists()) { //测试文件或目录是否存在,存在进入下一步
if (file.isFile()) { //判断file 是不是文件,如果是直接删除
file.delete();
}else{ //如果不是,则一定是文件夹
File[] files = file.listFiles(); //获取文件夹下的file对象列表
if (files.length==0) { //判断此文件夹下有没有文件或目录
file.delete(); //没有的话,直接删除此路径,有的话,遍历此路径,重复以上动作
}else{
for (File file1 : files) {
deleteFile(file1);
}
file.delete(); //文件夹下所有文件和目录均被清空,删除本文件夹
}
}
}else{
System.out.println("文件或目录不存在");
}
}
/**
* 将file文件装换成为
*/
public static MultipartFile fileToMultipartFile(String fileName) throws IOException {
File file = new File(fileName);
FileItemFactory factory = new DiskFileItemFactory(16, null);
FileItem item=factory.createItem(file.getName(),"text/plain",true,file.getName());
int bytesRead = 0;
byte[] buffer = new byte[8192];
try {
FileInputStream fis = new FileInputStream(file);
OutputStream os = item.getOutputStream();
while ((bytesRead = fis.read(buffer, 0, 8192)) != -1) {
os.write(buffer, 0, bytesRead);
}
os.close();
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
MultipartFile multipartFile = new CommonsMultipartFile(item);
return multipartFile;
}
}
最后补充一下
关于上传方法有一个坑,上传pdf的时候一定要指定清楚文件类型,可能会出现预览的时候乱码的问题
public class MinioUtils {
private static Logger log = LogManager.getLogger(LogManager.ROOT_LOGGER_NAME);
private static String bucketName;
private static String address;
private static MinioClient minioClient;
private static final Logger logger = LogManager.getLogger(TotalQueryController.class);
static{
MinioConfig minioConfig = new MinioConfig();
minioClient = minioConfig.getMinioClient();
Map<String, String> map = minioConfig.propertiesToMap("minio");
bucketName = map.get("minio.bucketName");
address = map.get("minio.address");
}
/**
* 查看存储bucket是否存在
* @return boolean
*/
public static Boolean bucketExists(String bucketName) {
//MinioClient minioClient = getMinioClient();
Boolean found;
try {
found = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
} catch (Exception e) {
//e.printStackTrace();
return false;
}
return found;
}
/**
* 创建存储bucket
* @return Boolean
*/
public static Boolean makeBucket(String bucketName) {
//MinioClient minioClient = getMinioClient();
try {
minioClient.makeBucket(MakeBucketArgs.builder()
.bucket(bucketName)
.build());
} catch (Exception e) {
e.printStackTrace();
logger.error("创建存储bucket时出现异常...",e);
return false;
}
return true;
}
/**
* 删除存储bucket
* @return Boolean
*/
public static Boolean removeBucket(String bucketName) {
//MinioClient minioClient = getMinioClient();
try {
minioClient.removeBucket(RemoveBucketArgs.builder()
.bucket(bucketName)
.build());
} catch (Exception e) {
e.printStackTrace();
logger.error("删除存储bucket时出现异常...",e);
return false;
}
return true;
}
/**
* 获取全部bucket
*/
public static List<Bucket> getAllBuckets() {
//MinioClient minioClient = getMinioClient();
try {
return minioClient.listBuckets();
} catch (Exception e) {
e.printStackTrace();
logger.error("获取存储bucket时出现异常...",e);
}
return null;
}
/**
* 文件上传
* @param file 文件
* @return Boolean
*/
public static String upload(MultipartFile file) {
//MinioClient minioClient = getMinioClient();
// 修饰过的文件名 非源文件名
logger.info("执行了upload");
StringBuilder fileName = new StringBuilder();
ExecutorService threadPool = Executors.newFixedThreadPool(5);
InputStream inputStream = null;
Date dd=new Date();
//格式化
SimpleDateFormat simTime =new SimpleDateFormat("yyyy/MM/dd");
String time=simTime.format(dd);
//拼接字符串为了实现分片
fileName = fileName.append(address).append("/").append(time)
.append("/").append(file.getOriginalFilename());
File toFile = multipartFileToFile(file);
//判断文件是否是pdf文件,如果是pdf文件,那么将contentType = "application/pdf",不这样做预览会出现问题
String temp = fileName.toString();
String str1 = temp.substring(0, temp.indexOf("."));
String name = temp.substring(str1.length()+1, temp.length());
String contentType = file.getContentType();
if("pdf".equals(name)){
contentType = "application/pdf";
}
try {
inputStream = new FileInputStream(toFile);
} catch (IOException e) {
e.printStackTrace();
}
try {
PutObjectArgs objectArgs = PutObjectArgs.builder().bucket(bucketName).object(fileName.toString())
.stream(inputStream,file.getSize(),-1).contentType(contentType).build();
//文件名称相同会覆盖
minioClient.putObject(objectArgs);
} catch (Exception e) {
e.printStackTrace();
logger.error("文件上传时出现异常...",e);
}
return fileName.toString();
}
/**
* 预览图片
* @param fileName
* @return
*/
public static String preview(String fileName){
//MinioClient minioClient = getMinioClient();
// 查看文件地址
GetPresignedObjectUrlArgs build = new GetPresignedObjectUrlArgs().builder().bucket(bucketName).object(fileName).method(Method.GET).build();
try {
String url = minioClient.getPresignedObjectUrl(build);
return url;
} catch (Exception e) {
e.printStackTrace();
logger.error("预览图片时出现异常...",e);
}
return null;
}
/**
* 文件下载
* @param fileName 文件名称
* @param res response
* @return Boolean
*/
public static void download(String fileName, HttpServletResponse res) {
//MinioClient minioClient = getMinioClient();
GetObjectArgs objectArgs = GetObjectArgs.builder().bucket(bucketName)
.object(fileName).build();
try (GetObjectResponse response = minioClient.getObject(objectArgs)){
byte[] buf = new byte[1024];
int len;
try (FastByteArrayOutputStream os = new FastByteArrayOutputStream()){
while ((len=response.read(buf))!=-1){
os.write(buf,0,len);
}
os.flush();
byte[] bytes = os.toByteArray();
res.setCharacterEncoding("utf-8");
//设置强制下载不打开
//res.setContentType("application/force-download");
res.addHeader("Content-Disposition", "attachment;fileName=" + fileName);
try (ServletOutputStream stream = res.getOutputStream()){
stream.write(bytes);
stream.flush();
}
}
} catch (Exception e) {
e.printStackTrace();
logger.error("文件下载时出现异常...",e);
}
}
/**
* 查看文件对象
* @return 存储bucket内文件对象信息
*/
public static List<Item> listObjects() {
//MinioClient minioClient = getMinioClient();
Iterable<Result<Item>> results = minioClient.listObjects(
ListObjectsArgs.builder().bucket(bucketName).build());
List<Item> items = new ArrayList<>();
try {
for (Result<Item> result : results) {
items.add(result.get());
}
} catch (Exception e) {
e.printStackTrace();
logger.error("查看文件对象时出现异常...",e);
return null;
}
return items;
}
/**
* 删除相关附件
* @param fileName:文件名称
* @return
* @throws Exception
*/
public static boolean remove(String fileName){
//MinioClient minioClient = getMinioClient();
try {
minioClient.removeObject( RemoveObjectArgs.builder().bucket(bucketName).object(fileName).build());
}catch (Exception e){
logger.error("删除相关附件时出现异常...",e);
return false;
}
return true;
}
/**
* 批量删除文件对象(没测试)
* @param objects 对象名称集合
*/
public static Iterable<Result<DeleteError>> removeObjects(List<String> objects) {
//MinioClient minioClient = getMinioClient();
List<DeleteObject> dos = objects.stream().map(e -> new DeleteObject(e)).collect(Collectors.toList());
Iterable<Result<DeleteError>> results = minioClient.removeObjects(RemoveObjectsArgs.builder().bucket(bucketName).objects(dos).build());
return results;
}
/**
*
* @Description 返回MultipartFile文件
* @return org.springframework.web.multipart.MultipartFile
* @date 2019/1/5 11:08
* @auther dell
*/
public static MultipartFile getFile(String filePath, String copyFile) throws IOException {
File file = new File(filePath);
FileItem fileItem = new DiskFileItem(copyFile, Files.probeContentType(file.toPath()),false,file.getName(),(int)file.length(),file.getParentFile());
byte[] buffer = new byte[4096];
int n;
try (InputStream inputStream = new FileInputStream(file); OutputStream os = fileItem.getOutputStream()){
while ( (n = inputStream.read(buffer,0,4096)) != -1){
os.write(buffer,0,n);
}
//也可以用IOUtils.copy(inputStream,os);
MultipartFile multipartFile = new CommonsMultipartFile(fileItem);
System.out.println(multipartFile.getName());
return multipartFile;
}catch (IOException e){
logger.error("返回MultipartFile文件时出现异常...",e);
e.printStackTrace();
}
return null;
}
public static Map<String, String> propertiesToMap(String properties) {
// 获得资源包
ResourceBundle bundle = ResourceBundle.getBundle(properties);
// 通过资源包拿到所有的名称
Enumeration<String> allName = bundle.getKeys();
Map<String, String> map= new HashMap();
// 遍历
while (allName.hasMoreElements()) {
// 获取每一个名称
String name = (String) allName.nextElement();
// 利用已得到的名称通过资源包获得相应的值
String value = bundle.getString(name);
map.put(name, value);
}
return map;
}
/**
* MultipartFile装换成File文件
* @param multiFile
* @return
*/
public static File multipartFileToFile(MultipartFile multiFile) {
// 获取文件名
String fileName = multiFile.getOriginalFilename();
// 获取文件后缀
String prefix = fileName.substring(fileName.lastIndexOf("."));
// 若须要防止生成的临时文件重复,能够在文件名后添加随机码
try {
File file = File.createTempFile(fileName, prefix);
multiFile.transferTo(file);
return file;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public static void deleteFileToName(String fileName){
File file=new File(fileName); //要删除的路径
deleteFile(file); //调用删除文件方法
}
/**
* 删除暂存在tomcat中的附件
* @param file
*/
private static void deleteFile(File file){
if (file.exists()) { //测试文件或目录是否存在,存在进入下一步
if (file.isFile()) { //判断file 是不是文件,如果是直接删除
file.delete();
}else{ //如果不是,则一定是文件夹
File[] files = file.listFiles(); //获取文件夹下的file对象列表
if (files.length==0) { //判断此文件夹下有没有文件或目录
file.delete(); //没有的话,直接删除此路径,有的话,遍历此路径,重复以上动作
}else{
for (File file1 : files) {
deleteFile(file1);
}
file.delete(); //文件夹下所有文件和目录均被清空,删除本文件夹
}
}
}else{
System.out.println("文件或目录不存在");
}
}
/**
* 将file文件装换成为
*/
public static MultipartFile fileToMultipartFile(String fileName) throws IOException {
File file = new File(fileName);
FileItemFactory factory = new DiskFileItemFactory(16, null);
FileItem item=factory.createItem(file.getName(),"text/plain",true,file.getName());
int bytesRead = 0;
byte[] buffer = new byte[8192];
try {
FileInputStream fis = new FileInputStream(file);
OutputStream os = item.getOutputStream();
while ((bytesRead = fis.read(buffer, 0, 8192)) != -1) {
os.write(buffer, 0, bytesRead);
}
os.close();
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
MultipartFile multipartFile = new CommonsMultipartFile(item);
return multipartFile;
}
}
浙公网安备 33010602011771号