minio 在windows系統安裝和使用
最近在使用minio做圖片存儲,在使用過程中遇到一些問題,總結記錄下來。這里不對minio做過多介紹,具體資料自行查找.
1、官網地址 https://min.io/
2、github地址 https://github.com/minio/minio
3、windows 服務端下載地址 https://dl.minio.io/server/minio/release/windows-amd64/minio.exe
4、安裝啟動
啟動一個cmd窗口,進入minio.exe所在文件夾,輸入如下命令 注:miniodata是需自己創建圖片上傳之后的存儲目錄
.\minio.exe server H:\DevelopTools\miniodata
運行成功之后,會看到下面的界面
使用命令行界面給出的地址都可以登錄,賬號密碼都在地址下面。登錄后如下圖所示。
在后台管理界面上你可以創建你的Bucket(桶),可以理解為一個文件夾用來存放圖片。桶創建成功之后就可以上傳圖片了
springboot整合minio實現文件預覽上傳和下載
第一步:引入依賴
<!--存儲文件依賴--> <dependency> <groupId>io.minio</groupId> <artifactId>minio</artifactId> <version>7.1.0</version>
</dependency>
第二步:配置參數類
/** * minio相關配置 也可以配置在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); } /** * 創建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); } /** * 上傳文件 * 返回可以直接預覽文件的URL */ public static String uploadFile(MultipartFile file) { try { //如果存儲桶不存在則創建 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對象中獲取 */ @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) { // // 獲取對象的元數據 // 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文件的下載或者預覽地址 * 取決於調用本方法的方法中的PutObjectOptions對象有沒有設置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); }
注:仔細看工具類中的方法上的注釋 可以返回預覽文件和下載文件的URL