Java實現minio

配置Dapplication.yml

minio:access-key: minioadminsecret-key: minioadminbucket-name: file #指定桶名稱endpoint: http://localhost:9000

實現代碼minioContriller.java

package com.setsail.setsailcusserver.controller;import com.alibaba.fastjson.JSONObject;
import com.setsail.setsailcusserver.service.UserRegisService;
import com.setsail.setsailcusserver.uatils.MinioUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;/*** @Description:* @Title: UserRegisController* @Author hello* @Date: 2023/4/10 9:49* @Version 1.0*/
@Slf4j
@RestController
@RequestMapping("/minio")
public class minioController {@Resourceprivate MinioUtils minioUtils;@Value("${minio.bucket-name}")private String bucketName;/*** 上傳* @param file* @throws Exception*/@GetMapping("uploadFile")public void uploadFile(@RequestParam(name = "file", required = false) MultipartFile file, HttpServletRequest request) throws Exception{// 桶名稱String bucketNameParam = request.getParameter("bucketName");// 如果沒有傳同名稱默認系統配置桶if (StringUtils.isBlank(bucketNameParam)){bucketNameParam=bucketName;}else {if (!minioUtils.createIsBucket(bucketNameParam)){return;}}JSONObject jsonObject = minioUtils.uploadFile(file, bucketNameParam);}/*** 桶是否存在* @param* @throws Exception*/@GetMapping("createIsBucket")public void createIsBucket(@RequestParam String bucketName) throws Exception{System.out.println(minioUtils.createIsBucket(bucketName));}/*** 刪除* @param fileName* @throws Exception*/@GetMapping("deleteObject")public void deleteObject(@RequestParam String  fileName,@RequestParam String  bucketNameParam) throws Exception{// 桶不存在if (!minioUtils.createIsBucket(bucketNameParam)){return;}minioUtils.deleteObject(fileName,bucketNameParam);}/*** 下載*  reakFileName 需要帶后綴名* @param response* @throws Exception*/@GetMapping("downLoad")public void downLoad(HttpServletRequest request, HttpServletResponse response) throws Exception{String bucketNameParam = request.getParameter("bucketName");if (!minioUtils.createIsBucket(bucketNameParam)){return;}String fileName = request.getParameter("fileName");minioUtils.downLoad(fileName,fileName,response,request);}/*** 下載圖片*  reakFileName 需要帶后綴名* @param response* @throws Exception*/@GetMapping("downloadImg")public void downloadImg( HttpServletResponse response,HttpServletRequest request) throws Exception{String bucketNameParam = request.getParameter("bucketName");String fileName = request.getParameter("fileName");if (StringUtils.isBlank(bucketNameParam)){bucketNameParam=bucketName;}else{if (!minioUtils.createIsBucket(bucketNameParam)){return;}}minioUtils.downloadImg(fileName,fileName,response,bucketNameParam);}/***查看圖片* @param response* @throws Exception*/@GetMapping("getImage")public void getImage( HttpServletResponse response,HttpServletRequest request) throws Exception{String bucketNameParam = request.getParameter("bucketName");if (!minioUtils.createIsBucket(bucketNameParam)){return;}String fileName = request.getParameter("fileName");// 檢查該桶下是否存在該圖片boolean objectExist = minioUtils.isObjectExist(bucketNameParam, fileName);if (!objectExist){return;}minioUtils.getImage(fileName,response,request);}/*** 獲取權限策略* @param* @throws Exception*/@GetMapping("getStrategy")public void getStrategy() throws Exception{minioUtils.getStrategy();}
}
MinioUtils工具類
package com.setsail.setsailcusserver.uatils;import com.alibaba.fastjson.JSONObject;
import com.alibaba.nacos.common.util.UuidUtils;
import io.minio.*;
import io.minio.errors.MinioException;
import io.minio.messages.Item;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;/*** @Author smallhou* @Date 2022-08-15 14:31* @Version V1.0*/
@Slf4j
@Component
public class MinioUtils {@Autowiredprivate  MinioClient minioClient;@Value("${minio.bucket-name}")private String bucketName;/*** @Author smallhou* @Description //TODO 判斷桶存在不存在,不存在創建桶* @Date 10:49 2022-08-16* @Param [bucketName]* @return void**/@SneakyThrowspublic void createBucket(String bucketName) {if (!minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build())) {minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());}}/*** @Description //TODO 判斷桶是否存在* @Param [bucketName]* @return void**/@SneakyThrowspublic boolean createIsBucket(String bucketName) {return minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());}@SneakyThrowspublic InputStream getObjectInputStream(String objectName,String bucketName){GetObjectArgs getObjectArgs = GetObjectArgs.builder().bucket(bucketName).object(objectName).build();return minioClient.getObject(getObjectArgs);}/*** 上傳文件** @param file       文件* @param bucketName 存儲桶* @return*/public JSONObject uploadFile(MultipartFile file, String bucketName) throws Exception {JSONObject res = new JSONObject();res.put("code", 0);// 判斷上傳文件是否為空if (null == file || 0 == file.getSize()) {res.put("msg", "上傳文件不能為空");return res;}try {// 判斷存儲桶是否存在createBucket(bucketName);// 文件名String originalFilename = file.getOriginalFilename();// 新的文件名 = 存儲桶名稱_時間戳.后綴名String fileName = bucketName + "_" + System.currentTimeMillis() + originalFilename.substring(originalFilename.lastIndexOf("."));InputStream inputStream = file.getInputStream();PutObjectArgs putObjectArgs = PutObjectArgs.builder().bucket(bucketName).object(fileName).contentType(  file.getContentType()).stream(inputStream, inputStream.available(), -1).build();this.minioClient.putObject(putObjectArgs);// 開始上傳res.put("code", 1);res.put("msg",  bucketName + "/" + fileName);res.put("bucket", bucketName);res.put("fileName", fileName);return res;}  catch (Exception e) {log.error("上傳文件失敗:{}", e.getMessage());}res.put("msg", "上傳失敗");return res;}public JSONObject uploadFile(JSONObject fileObj) throws Exception {JSONObject res = new JSONObject();res.put("code", 0);// 判斷上傳文件是否為空if (null == fileObj ) {res.put("msg", "上傳文件不能為空");return res;}InputStream is=null;try {// 判斷存儲桶是否存在createBucket(bucketName);// 文件名String originalFilename = fileObj.getString("originalFilename");// 新的文件名 = 存儲桶名稱_時間戳.后綴名String fileName = bucketName + "_" + UuidUtils.generateUuid() + originalFilename.substring(originalFilename.lastIndexOf("."));// 開始上傳 文件的絕對路徑is=new FileInputStream(fileObj.getString("inputStream"));PutObjectArgs putObjectArgs = PutObjectArgs.builder().bucket(bucketName).object(fileName).contentType(fileObj.getString("contentType")).stream(is, is.available(), -1).build();this.minioClient.putObject(putObjectArgs);res.put("code", 1);res.put("msg",  bucketName + "/" + fileName);res.put("bucket", bucketName);res.put("fileName", fileName);return res;}  catch (Exception e) {e.printStackTrace();log.error("上傳文件失敗:{}", e.getMessage());}finally {is.close();}res.put("msg", "上傳失敗");return res;}public void downLoad(String fileName,String realFileName, HttpServletResponse response, HttpServletRequest request) {InputStream is=null;OutputStream os =null;String bucketNameParam = request.getParameter("bucketName");if (StringUtils.isBlank(bucketNameParam)){bucketNameParam=bucketName;}try {is=getObjectInputStream(fileName,bucketNameParam);if(is!=null){byte buf[] = new byte[1024];int length = 0;String codedfilename = "";String agent = request.getHeader("USER-AGENT");System.out.println("agent:" + agent);if ((null != agent && -1 != agent.indexOf("MSIE")) || (null != agent && -1 != agent.indexOf("Trident"))) {String name = URLEncoder.encode(realFileName, "UTF8");codedfilename = name;} else if (null != agent && -1 != agent.indexOf("Mozilla")) {codedfilename = new String(realFileName.getBytes("UTF-8"), "iso-8859-1");} else {codedfilename = new String(realFileName.getBytes("UTF-8"), "iso-8859-1");}response.reset();response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(realFileName.substring(realFileName.lastIndexOf("/") + 1), "UTF-8"));response.setContentType("application/x-msdownload");response.setCharacterEncoding("UTF-8");os = response.getOutputStream();// 輸出文件while ((length = is.read(buf)) > 0) {os.write(buf, 0, length);}// 關閉輸出流os.close();}else{log.error("下載失敗");}}catch (Exception e){e.printStackTrace();log.error("錯誤:"+e.getMessage());}finally {if(is!=null){try {is.close();} catch (IOException e) {e.printStackTrace();}}if(os!=null){try {os.close();} catch (IOException e) {e.printStackTrace();}}}}public void downloadImg(String fileName,String realFileName, HttpServletResponse httpResponse,String bucketNameParam) {try{//imgBucket--桶名稱  filename-- 圖片名稱InputStream files = minioClient.getObject(bucketNameParam, fileName);InputStream ism = new BufferedInputStream(files);// 調用statObject()來判斷對象是否存在。// 如果不存在, statObject()拋出異常,// 否則則代表對象存在minioClient.statObject(bucketNameParam, fileName);byte buf[] = new byte[1024];int length = 0;httpResponse.reset();//Content-disposition 是 MIME 協議的擴展,MIME 協議指示 MIME 用戶代理如何顯示附加的文件。// Content-disposition其實可以控制用戶請求所得的內容存為一個文件的時候提供一個默認的文件名,// 文件直接在瀏覽器上顯示或者在訪問時彈出文件下載對話框。httpResponse.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(realFileName, "UTF-8"));httpResponse.setContentType("application/x-msdownload");httpResponse.setCharacterEncoding("utf-8");OutputStream osm = new BufferedOutputStream(httpResponse.getOutputStream());while ((length = ism.read(buf))>0) {osm.write(buf,0, length);}//關閉流osm.close();} catch (MinioException ex) {ex.printStackTrace();}  catch (NoSuchAlgorithmException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} catch (InvalidKeyException e) {e.printStackTrace();} catch (Exception e) {e.printStackTrace();}}/***  圖片查看* @param fileName* @param response* @throws IOException*/public void getImage( String fileName, HttpServletResponse response,HttpServletRequest request) throws IOException {InputStream in = null;String bucketNameParam = request.getParameter("bucketName");if (StringUtils.isBlank(bucketNameParam)){bucketNameParam=bucketName;}try {in = minioClient.getObject(GetObjectArgs.builder().bucket(bucketNameParam).object(fileName).build());} catch (Exception e) {e.printStackTrace();}if (in == null){response.sendError(404, "未能找到圖片");}//圖片類型String[] fileArr = fileName.split("\\.");String contentType = "";StringBuilder originalFileName = new StringBuilder();if (fileArr.length > 1){contentType = "image/" + fileArr[fileArr.length - 1];for (int i = 0; i < fileArr.length - 1; i++) {originalFileName.append(fileArr[i]);if (i != fileArr.length - 2){originalFileName.append(".");}}}else {contentType = "application/octet-stream";originalFileName = new StringBuilder(fileName);}try {response.addHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");response.addHeader("X-Original-File-Name", originalFileName.toString());response.setContentType(contentType);ServletOutputStream outputStream = response.getOutputStream();IOUtils.copy(in, outputStream);outputStream.flush();outputStream.close();} catch (IOException e) {e.printStackTrace();}}public void deleteObject(String fileName,String bucketNameParam) {if (StringUtils.isBlank(bucketNameParam)){bucketNameParam = bucketName;}try {RemoveObjectArgs removeObjectArgs = RemoveObjectArgs.builder().bucket(bucketNameParam).object(fileName).build();minioClient.removeObject(removeObjectArgs);}catch (Exception e){log.error("錯誤:"+e.getMessage());}}public void getStrategy() {try {String bucketPolicy = minioClient.getBucketPolicy(GetBucketPolicyArgs.builder().bucket(bucketName).build());System.out.println(bucketPolicy);}catch (Exception e){log.error("錯誤:"+e.getMessage());}}/*** 判斷文件是否存在* @param bucketName 存儲桶* @param objectName 文件名* @return*/public  Boolean isObjectExist(String bucketName, String objectName) {boolean exist = true;try {minioClient.statObject(StatObjectArgs.builder().bucket(bucketName).object(objectName).build());} catch (Exception e) {exist = false;}return exist;}/*** 判斷文件夾是否存在** @param bucketName 桶名稱* @param folderName 文件夾名稱* @return true存在, 反之*/public Boolean checkFolderIsExist(String bucketName, String folderName) {try {Iterable<Result<Item>> results = minioClient.listObjects(ListObjectsArgs.builder().bucket(bucketName).prefix(folderName).recursive(false).build());for (Result<Item> result : results) {Item item = result.get();if (item.isDir() && folderName.equals(item.objectName())) {return true;}}} catch (Exception e) {return false;}return true;}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/213393.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/213393.shtml
英文地址,請注明出處:http://en.pswp.cn/news/213393.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

萬界星空科技五金家具行業MES解決方案

MES系統如何與家具企業生產相匹配&#xff1f;相較于其它大多數工業軟件&#xff0c;MES系統無疑是受企業歡迎的軟件之一。MES系統處于制造生產企業信息化的核心領域&#xff0c;有著承上啟下的作用。那MES系統如何與家具企業生產相匹配&#xff1f; 五金家具行業的工藝特點&am…

最簡單的pixel刷機和安裝面具、lsposed

一 下載手機對應的系統 1&#xff0c;手機usb連接然后重啟進入Fastboot模式&#xff1a;adb reboot bootloader2&#xff0c;找到你下載的系統&#xff0c;Windows 系統 直接運行 flash-all.bat上圖 &#xff1a;左邊就是安卓11和12的系統&#xff0c;右邊是對應的手機型號 下…

mysql:修改整數字段的顯式長度不生效

例如&#xff0c;我使用mysql 8.2.0版本&#xff0c;想修改整數字段的顯式長度&#xff0c;不會生效&#xff0c;提醒整數的顯示長度已經廢棄&#xff0c;會在將來某個版本去掉&#xff1a; mysql官網中也有說明&#xff1a; https://dev.mysql.com/doc/refman/8.2/en/numeric…

帶阻濾波器:原理、應用及性能分析?|深圳比創達電子EMC

在現代電子技術和通信領域中&#xff0c;濾波器是一種常見的電路元件&#xff0c;用于處理信號&#xff0c;去除不需要的頻率成分或者增強感興趣的頻率成分。本文將重點探討帶阻濾波器&#xff0c;它是一種特殊類型的濾波器&#xff0c;具有在特定頻率范圍內抑制信號的功能。我…

SSD自己也能復制粘貼?淺談NVMe 2.0 Copy Command命令

復制粘貼&#xff08;CtrlC/V&#xff09;作為現代打工人日常辦公的必備生存技能&#xff0c;想必大家都非常熟悉。但你知道嗎&#xff0c;其實SSD自身也能進行這個非常實用的操作。可能有的讀者要說了&#xff1a;這有什么稀奇&#xff0c;復制粘貼這么簡單的功能&#xff0c;…

騰訊字節常考的linux命令

1 ps 1.1 ps -ef 有哪些字段 ps -ef 命令在Unix/Linux系統中用于顯示當前運行的進程。輸出的字段通常包括&#xff1a; UID&#xff1a;啟動進程的用戶ID。PID&#xff1a;進程ID。PPID&#xff1a;父進程ID。C&#xff1a;CPU利用率。STIME&#xff1a;進程啟動時間。TTY&a…

安卓上比iOS快捷指令更強大的工具——MacroDroid

使用 MacroDroid (Android) 自動化您的日常生活——一個簡單的自動化應用程序&#xff0c;用于在 Android 上自動執行任務以及如何在其上自動執行任務。 iOS 和 Android 之間的區別? iOS和Android是兩種不同的移動操作系統&#xff0c;iOS由蘋果公司開發&#xff0c;于2007年…

conda配環境問題合集

&#xff08;CtrlF&#xff0c;請&#xff09; 問題&#xff1a; File "F:\Anaconda3\envs\YOLOv5\lib\ssl.py", line 773, in __init__ raise ValueError("check_hostname requires server_hostname") ValueError: check_hostname requires server_h…

Vue2解決pinia刷新后數據丟失的問題

Pinia&#xff1a;官網 Pinia 是一個 Vue.js 狀態管理庫&#xff0c;如果你在組件中修改了 store 中的數據并刷新了界面&#xff0c;Pinia 會將 store 中的數據重置為初始值&#xff0c;從而導致數據丟失的問題。 這里給出vue2的解決方案&#xff1a; 可以使用 Pinia 的 Per…

當接口要加入新方法時,我后悔沒有早點學設計模式了

&#x1f4e2;?聲明&#xff1a; &#x1f344; 大家好&#xff0c;我是風箏 &#x1f30d; 作者主頁&#xff1a;【古時的風箏CSDN主頁】。 ?? 本文目的為個人學習記錄及知識分享。如果有什么不正確、不嚴謹的地方請及時指正&#xff0c;不勝感激。 直達博主&#xff1a;「…

PP材料粘接ABS材料使用UV膠的好處?

跟隨著現階段材料的不斷發展更迭&#xff0c;PP材料應用越來越廣&#xff0c;生產效率要求越來越高&#xff0c;為了加快生產&#xff0c;提高效率&#xff0c;PP材料的粘接上使用UV膠粘接PP&#xff08;聚丙烯&#xff09;和ABS&#xff08;丙烯腈-丁二烯-苯乙烯共聚物&#x…

python Open3D加載obj

pip安裝Open3D python -m pip install open3d示例代碼 import numpy as np import open3d as o3dpath_obj test/assimp-5.2.5/test/models/OBJ/box.objmesh o3d.io.read_triangle_mesh(path_obj, enable_post_processingTrue)print(np.asarray(mesh.vertices))mesh.compute…

Jenkins:持續集成與持續交付的自動化利器

隨著軟件開發行業的快速發展&#xff0c;持續集成&#xff08;Continuous Integration&#xff0c;簡稱CI&#xff09;和持續交付&#xff08;Continuous Delivery&#xff0c;簡稱CD&#xff09;已經成為了現代軟件開發的重要理念。Jenkins作為一款開源的持續集成和持續交付工…

企業可以利用SD-WAN打破網絡限制,實現高效穩定的應用訪問

在當今數字化時代&#xff0c;我們面臨著越來越多復雜應用和各種類型的數據傳輸。企業需要實時訪問云應用、視頻會議等關鍵應用&#xff0c;不斷增長的訪問流量&#xff0c;導致應用訪問速度變得越來越慢&#xff0c;給工作效率和用戶體驗帶來了很大困擾。 SD-WAN是否能夠解決這…

javaSwing酒店管理

一、介紹 在這篇博客中&#xff0c;我們將介紹一個基于MySQL數據庫、Java編程語言和Swing圖形用戶界面的簡單酒店管理系統。該系統包括了查詢房客信息、查詢房客狀態、修改房客信息、添加房間信息、添加住戶、退房管理、預定管理、退訂管理、入賬管理、出賬管理、修改資料等多…

0009Java程序設計-ssm微信小程序在慢性疾病管理中的應用

文章目錄 **摘要**目錄系統實現開發環境 編程技術交流、源碼分享、模板分享、網課分享 企鵝&#x1f427;裙&#xff1a;776871563 摘要 首先,論文一開始便是清楚的論述了小程序的研究內容。其次,剖析系統需求分析,弄明白“做什么”,分析包括業務分析和業務流程的分析以及用例…

極坐標曲線@典型的4種曲線

文章目錄 abstract典型曲線心形線玫瑰線阿基米德螺線伯努利雙扭線 abstract 除了圓和圓錐曲線外,還有許多曲線用極坐標描述會簡單得多 典型曲線 分析下列曲線時,線分析是否含有三角函數(周期性) 利用描點法做出單個周期內的圖形 作圖:可以打開geogebra https://www.geogebr…

記:vite3+vue3+axios前端項目跨域問題解決【前端和服務器nginx配置】

前言&#xff1a;什么是跨域&#xff0c;網上一搜一大把&#xff0c;所以這里直接跳過&#xff0c;直入主題。 處理方式&#xff1a;不通過后端處理跨域&#xff0c;通過前端服務器nginx處理。 1.前端涉及處理跨域的必要配置&#xff08;開發環境、生產環境&#xff09;&…

銀行插件導致的Outlook客戶端無法連接服務器問題

問題現象 最近遇到好些同事出現outlook客戶端無法連接服務器的情況&#xff0c;具體現象就是右下角一直顯示【正在嘗試連接…】或者【需要密碼】&#xff0c;點擊【需要密碼】按鈕&#xff0c;輸密碼的彈窗是一個完全空白的頁面。 此時打開word&#xff0c;右上角那里去登錄o…

LeetCode19. Remove Nth Node From End of List

文章目錄 一、題目二、題解 一、題目 Given the head of a linked list, remove the nth node from the end of the list and return its head. Example 1: Input: head [1,2,3,4,5], n 2 Output: [1,2,3,5] Example 2: Input: head [1], n 1 Output: [] Example 3: I…