Java整合minio實(shí)現(xiàn)文件預(yù)覽上傳和下載
minio 在windows系統(tǒng)安裝和使用
最近在使用minio做圖片存儲(chǔ),在使用過程中遇到一些問題,總結(jié)記錄下來。這里不對(duì)minio做過多介紹,具體資料自行查找.
1、官網(wǎng)地址 https://min.io/
2、github地址 https://github.com/minio/minio
3、windows 服務(wù)端下載地址 https://dl.minio.io/server/minio/release/windows-amd64/minio.exe
4、安裝啟動(dòng)
啟動(dòng)一個(gè)cmd窗口,進(jìn)入minio.exe所在文件夾,輸入如下命令 注:miniodata是需自己創(chuàng)建圖片上傳之后的存儲(chǔ)目錄
.\minio.exe server H:\DevelopTools\miniodata
運(yùn)行成功之后,會(huì)看到下面的界面

使用命令行界面給出的地址都可以登錄,賬號(hào)密碼都在地址下面。登錄后如下圖所示。

在后臺(tái)管理界面上你可以創(chuàng)建你的Bucket(桶),可以理解為一個(gè)文件夾用來存放圖片。桶創(chuàng)建成功之后就可以上傳圖片了
springboot整合minio實(shí)現(xiàn)文件預(yù)覽上傳和下載
第一步:引入依賴
<!--存儲(chǔ)文件依賴-->
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>7.1.0</version>
</dependency>
第二步:配置參數(shù)類
/**
* minio相關(guān)配置 也可以配置在yml文件
*/
@Component
public class ParamConfig {
public static String endpoint = "http://127.0.0.1:9000";
public static String accessKey = "minioadmin";
public static String secretKey = "minioadmin";
public static String bucketName = "uavtest";
}
第三步:添加MinIoUtil
import cn.hutool.core.date.DateUtil;
import io.minio.MinioClient;
import io.minio.PutObjectOptions;
import io.minio.messages.Bucket;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.PostConstruct;
import java.io.InputStream;
import java.util.Date;
import java.util.List;
/**
* Minio工具類
*/
@Slf4j
@Component
public class MinIoUtil {
public static MinioClient minioClient;
public static ParamConfig paramConfig;
/**
* 初始化minio配置
*/
@PostConstruct
public void init() {
try {
log.info("Minio Initialize........................");
minioClient = MinioClient.builder().endpoint(paramConfig.endpoint).credentials(paramConfig.accessKey, paramConfig.secretKey).build();
createBucket(paramConfig.bucketName);
log.info("Minio Initialize........................successful");
} catch (Exception e) {
e.printStackTrace();
log.error("初始化minio配置異常: 【{}】", e.fillInStackTrace());
}
}
/**
* 判斷bucket是否存在
*/
@SneakyThrows(Exception.class)
public static boolean bucketExists(String bucketName) {
return minioClient.bucketExists(bucketName);
}
/**
* 創(chuàng)建bucket
*/
@SneakyThrows(Exception.class)
public static void createBucket(String bucketName) {
boolean isExist = minioClient.bucketExists(bucketName);
if (!isExist) {
minioClient.makeBucket(bucketName);
}
}
/**
* 獲取全部bucket
*/
@SneakyThrows(Exception.class)
public static List<Bucket> getAllBuckets() {
return minioClient.listBuckets();
}
/**
* 文件上傳
*
* @param bucketName: 桶名
* @param fileName: 文件名
* @param filePath: 文件路徑
*/
@SneakyThrows(Exception.class)
public static void upload(String bucketName, String fileName, String filePath) {
minioClient.putObject(bucketName, fileName, filePath, null);
}
/**
* 上傳文件
* 返回可以直接預(yù)覽文件的URL
*/
public static String uploadFile(MultipartFile file) {
try {
//如果存儲(chǔ)桶不存在則創(chuàng)建
if (!bucketExists(ParamConfig.bucketName)) {
createBucket(ParamConfig.bucketName);
}
PutObjectOptions putObjectOptions = new PutObjectOptions(file.getInputStream().available(), -1);
putObjectOptions.setContentType(file.getContentType());
String originalFilename = file.getOriginalFilename();
//得到文件流
InputStream inputStream = file.getInputStream();
//保證文件不重名(并且沒有特殊字符)
String fileName = ParamConfig.bucketName + DateUtil.format(new Date(), "_yyyyMMddHHmmss") + originalFilename;
minioClient.putObject(ParamConfig.bucketName, fileName, inputStream, putObjectOptions);
return getPreviewFileUrl(ParamConfig.bucketName, fileName);
} catch (Exception e) {
e.printStackTrace();
return "";
}
}
/**
* 文件上傳
* 返回下載文件url地址 和下面upload方法僅傳參不同
* bucketName 也可以直接從ParamConfig對(duì)象中獲取
*/
@SneakyThrows(Exception.class)
public static String upload(String bucketName, String fileName, InputStream stream) {
minioClient.putObject(bucketName, fileName, stream, new PutObjectOptions(stream.available(), -1));
return getPreviewFileUrl(bucketName, fileName);
}
/**
* 文件上傳
* 返回下載文件url地址 和上面upload方法僅傳參不同
*/
@SneakyThrows(Exception.class)
public static String upload(String bucketName, MultipartFile file) {
final InputStream is = file.getInputStream();
final String fileName = file.getOriginalFilename();
minioClient.putObject(bucketName, fileName, is, new PutObjectOptions(is.available(), -1));
is.close();
return getPreviewFileUrl(bucketName, fileName);
}
/**
* 刪除文件
*
* @param bucketName: 桶名
* @param fileName: 文件名
*/
@SneakyThrows(Exception.class)
public static void deleteFile(String bucketName, String fileName) {
minioClient.removeObject(bucketName, fileName);
}
/**
* 下載文件
*/
// @SneakyThrows(Exception.class)
// public static void download(String bucketName, String fileName, HttpServletResponse response) {
// // 獲取對(duì)象的元數(shù)據(jù)
// final ObjectStat stat = minioClient.statObject(bucketName, fileName);
// response.setContentType(stat.contentType());
// response.setCharacterEncoding("UTF-8");
// response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
// InputStream is = minioClient.getObject(bucketName, fileName);
// IOUtils.copy(is, response.getOutputStream());
// is.close();
// }
/**
* 獲取minio文件的下載或者預(yù)覽地址
* 取決于調(diào)用本方法的方法中的PutObjectOptions對(duì)象有沒有設(shè)置contentType
*
* @param bucketName: 桶名
* @param fileName: 文件名
*/
@SneakyThrows(Exception.class)
public static String getPreviewFileUrl(String bucketName, String fileName) {
return minioClient.presignedGetObject(bucketName, fileName);
}
}
第四步:接口中引用
@ResponseBody
@PostMapping("/tFlightFileUpload")
@ApiOperation(value = "文件上傳管理-添加minio")
public Response add(@RequestParam("file") MultipartFile file) throws IOException {
String url = MinIoUtil.uploadFile(file);
return Response.success(url);
}
注:仔細(xì)看工具類中的方法上的注釋 可以返回預(yù)覽文件和下載文件的URL
now ,fight for future

浙公網(wǎng)安備 33010602011771號(hào)