ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/BaseTagcategoryController.java
@@ -10,6 +10,7 @@ import com.smartor.service.IBaseTagcategoryService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; @@ -24,6 +25,7 @@ * @date 2023-06-15 */ @Api(description = "æ ç¾åç±»") @Slf4j @RestController @RequestMapping("/system/tagcategory") public class BaseTagcategoryController extends BaseController { @@ -67,6 +69,7 @@ */ @PreAuthorize("@ss.hasPermi('system:tagcategory:add')") @Log(title = "æ ç¾åç±»", businessType = BusinessType.INSERT) @ApiOperation("æ°å¢æ ç¾åç±»") @PostMapping public AjaxResult add(@RequestBody BaseTagcategory baseTagcategory) { return toAjax(baseTagcategoryService.insertBaseTagcategory(baseTagcategory)); @@ -77,16 +80,18 @@ */ @PreAuthorize("@ss.hasPermi('system:tagcategory:edit')") @Log(title = "æ ç¾åç±»", businessType = BusinessType.UPDATE) @ApiOperation("ä¿®æ¹æ ç¾åç±»") @PutMapping public AjaxResult edit(@RequestBody BaseTagcategory baseTagcategory) { return toAjax(baseTagcategoryService.updateBaseTagcategory(baseTagcategory)); } /** * å 餿 ç¾åç±» * æ ¹æ®åç±»IDå 餿 ç¾åç±» */ @PreAuthorize("@ss.hasPermi('system:tagcategory:remove')") @Log(title = "æ ç¾åç±»", businessType = BusinessType.DELETE) @ApiOperation("æ ¹æ®åç±»IDå 餿 ç¾åç±»") @DeleteMapping("/{tagcategoryids}") public AjaxResult remove(@PathVariable Long[] tagcategoryids) { return toAjax(baseTagcategoryService.deleteBaseTagcategoryByTagcategoryids(tagcategoryids)); @@ -100,4 +105,6 @@ public TableDataInfo baseTagCategoryByName(@RequestParam("name") String name) { return getDataTable(baseTagcategoryService.baseTagCategoryByName(name)); } } ruoyi-admin/src/main/java/com/ruoyi/web/controller/smartor/MinioFileController.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,150 @@ package com.ruoyi.web.controller.smartor; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.utils.poi.ExcelUtil; import com.smartor.domain.MinioFile; import com.smartor.service.IMinioFileService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; import org.apache.commons.collections4.CollectionUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; import java.util.List; /** * ã请填ååè½åç§°ãController * * @author ruoyi * @date 2023-06-19 */ @Api(description = "æä»¶ç®¡çï¼ææ¡£ãå¾ç...ï¼") @RestController @RequestMapping("/system/file") public class MinioFileController extends BaseController { @Autowired private IMinioFileService minioFileService; /** * æ¥è¯¢ã请填ååè½åç§°ãå表 */ @PreAuthorize("@ss.hasPermi('system:file:list')") @GetMapping("/list") public TableDataInfo list(MinioFile minioFile) { startPage(); List<MinioFile> list = minioFileService.selectMinioFileList(minioFile); return getDataTable(list); } /** * 导åºã请填ååè½åç§°ãå表 */ @PreAuthorize("@ss.hasPermi('system:file:export')") @Log(title = "ã请填ååè½åç§°ã", businessType = BusinessType.EXPORT) @PostMapping("/export") public void export(HttpServletResponse response, MinioFile minioFile) { List<MinioFile> list = minioFileService.selectMinioFileList(minioFile); ExcelUtil<MinioFile> util = new ExcelUtil<MinioFile>(MinioFile.class); util.exportExcel(response, list, "ã请填ååè½åç§°ãæ°æ®"); } /** * è·åã请填ååè½åç§°ã详ç»ä¿¡æ¯ */ @PreAuthorize("@ss.hasPermi('system:file:query')") @GetMapping(value = "/{id}") public AjaxResult getInfo(@PathVariable("id") Long id) { return success(minioFileService.selectMinioFileById(id)); } /** * æ°å¢ã请填ååè½åç§°ã */ @PreAuthorize("@ss.hasPermi('system:file:add')") @Log(title = "ã请填ååè½åç§°ã", businessType = BusinessType.INSERT) @PostMapping public AjaxResult add(@RequestBody MinioFile minioFile) { return toAjax(minioFileService.insertMinioFile(minioFile)); } /** * ä¿®æ¹ã请填ååè½åç§°ã */ @PreAuthorize("@ss.hasPermi('system:file:edit')") @Log(title = "ã请填ååè½åç§°ã", businessType = BusinessType.UPDATE) @PutMapping public AjaxResult edit(@RequestBody MinioFile minioFile) { return toAjax(minioFileService.updateMinioFile(minioFile)); } /** * å é¤ã请填ååè½åç§°ã */ @PreAuthorize("@ss.hasPermi('system:file:remove')") @Log(title = "ã请填ååè½åç§°ã", businessType = BusinessType.DELETE) @DeleteMapping("/{ids}") public AjaxResult remove(@PathVariable Long[] ids) { return toAjax(minioFileService.deleteMinioFileByIds(ids)); } /** * ä¸ä¼ æä»¶å°æä»¶ç®¡ç,æ¯ææ¹éä¸ä¼ * * @param files * @return */ @PostMapping(value = {"/admin/uploadFile"}) @ResponseBody @ApiOperation(value = "ä¸ä¼ æä»¶å°æä»¶ç®¡ç,æ¯ææ¹éä¸ä¼ ") @ApiImplicitParam(name = "files", value = "æä»¶å¯¹è±¡", dataType = "File") public AjaxResult commonUploadFile(@RequestParam("path") String path, @RequestParam("files") List<MultipartFile> files) { if (CollectionUtils.isEmpty(files)) { return error("æªéæ©æä»¶ï¼"); } return success(minioFileService.commonUploadFile(path, files)); } /** * è·åï¼å®£æï¼å¼ç¨æ¨¡æ¿ */ @PreAuthorize("@ss.hasPermi('system:file:list')") @ApiOperation(value = "è·åï¼å®£æï¼å¼ç¨æ¨¡æ¿") @GetMapping("/getEduTemplage") public AjaxResult getEduTemplage() { // startPage(); return success(minioFileService.getEduTemplage()); } /** * ä¸è½½æä»¶ï¼ä»¥æµçå½¢å¼è¿å * * @return */ @ApiOperation(value = "ä¸è½½æä»¶ï¼ä»¥è¾åºæµçå½¢å¼è¿å, å ¥åçfileNameä¸ºå ¨è·¯å¾æä»¶å") @GetMapping("/downloadFile") public void downloadFile(HttpServletResponse response, @RequestParam("fileName") String fileName) { minioFileService.downloadFile(response, fileName); } /** * è·åå¾çãé³é¢ãè§é¢ çURL * * @return */ @ApiOperation(value = "è·åå¾çãé³é¢ãè§é¢ çURL, å ¥åçfileNameä¸ºå ¨è·¯å¾æä»¶å,expiresä¸ºé¾æ¥è¿ææ¶é´") @GetMapping("/getFileUrl") public AjaxResult getFileUrl(@RequestParam("fileName") String fileName, @RequestParam("expires") Integer expires) { return success(minioFileService.getFileUrl(fileName, expires)); } } ruoyi-admin/src/main/resources/application.yml
@@ -59,9 +59,9 @@ servlet: multipart: # å个æä»¶å¤§å° max-file-size: 10MB max-file-size: 500MB # 设置æ»ä¸ä¼ çæä»¶å¤§å° max-request-size: 20MB max-request-size: 750MB # æå¡æ¨¡å devtools: restart: @@ -90,6 +90,15 @@ # #è¿æ¥æ± æå¤§é»å¡çå¾ æ¶é´ï¼ä½¿ç¨è´å¼è¡¨ç¤ºæ²¡æéå¶ï¼ max-wait: -1ms # minioæä»¶ç®¡çè¿æ¥ minio: endpoint: http://192.168.1.4 port: 9002 accessKey: lihu secretKey: lihu@123 bucketName: lihu secure: false # tokené ç½® token: # 令çèªå®ä¹æ è¯ ruoyi-common/pom.xml
@@ -17,6 +17,12 @@ <dependencies> <dependency> <groupId>io.minio</groupId> <artifactId>minio</artifactId> <version>7.1.0</version> </dependency> <!-- Springæ¡æ¶åºæ¬çæ ¸å¿å·¥å · --> <dependency> <groupId>org.springframework</groupId> ruoyi-common/src/main/java/com/ruoyi/common/config/MinioConfig.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,27 @@ package com.ruoyi.common.config; import io.minio.MinioClient; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.stereotype.Component; @Configuration @Component @ConfigurationProperties(prefix = "minio") @Data public class MinioConfig { private String endpoint; private int port; private String accessKey; private String secretKey; private Boolean secure; private String bucketName; @Bean public MinioClient getMinioClient() { MinioClient minioClient = MinioClient.builder().endpoint(endpoint, port, secure).credentials(accessKey, secretKey).build(); return minioClient; } } ruoyi-common/src/main/java/com/ruoyi/common/utils/MinioClientUtils.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,466 @@ package com.ruoyi.common.utils; import io.minio.*; import io.minio.errors.*; import io.minio.http.Method; import io.minio.messages.Bucket; import io.minio.messages.DeleteError; import io.minio.messages.DeleteObject; import io.minio.messages.Item; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.InputStream; import java.nio.charset.StandardCharsets; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import java.util.ArrayList; import java.util.List; @Component @Slf4j public class MinioClientUtils { @Resource private MinioClient minioClient; private static final int DEFAULT_EXPIRY_TIME = 999999 * 24 * 3600; /** * æ£æ¥å卿¡¶æ¯å¦åå¨ * * @param bucketName å卿¡¶åç§° * @return boolean */ public boolean bucketExists(String bucketName) throws Exception { boolean flag = false; flag = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build()); if (flag) { return true; } return false; } /** * å建å卿¡¶ * * @param bucketName å卿¡¶åç§° */ public boolean makeBucket(String bucketName) throws Exception { boolean flag = bucketExists(bucketName); if (!flag) { minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build()); return true; } else { return false; } } /** * ååºææå卿¡¶åç§° * * @return List<String> */ public List<String> listBucketNames() throws Exception { List<Bucket> bucketList = listBuckets(); List<String> bucketListName = new ArrayList<>(); for (Bucket bucket : bucketList) { bucketListName.add(bucket.name()); } return bucketListName; } /** * ååºææå卿¡¶ * * @return List<Bucket> */ public List<Bucket> listBuckets() throws Exception { return minioClient.listBuckets(); } /** * å é¤å卿¡¶ * * @param bucketName å卿¡¶åç§° * @return boolean */ public boolean removeBucket(String bucketName) throws Exception { boolean flag = bucketExists(bucketName); if (flag) { Iterable<Result<Item>> myObjects = listObjects(bucketName); for (Result<Item> result : myObjects) { Item item = result.get(); // æå¯¹è±¡æä»¶ï¼åå é¤å¤±è´¥ if (item.size() > 0) { return false; } } // å é¤å卿¡¶ï¼æ³¨æï¼åªæå卿¡¶ä¸ºç©ºæ¶æè½å 餿åã minioClient.removeBucket(RemoveBucketArgs.builder().bucket(bucketName).build()); flag = bucketExists(bucketName); if (!flag) { return true; } } return false; } /** * ååºå卿¡¶ä¸çææå¯¹è±¡åç§° * * @param bucketName å卿¡¶åç§° * @return List<String> */ public List<String> listObjectNames(String bucketName) throws Exception { List<String> listObjectNames = new ArrayList<>(); boolean flag = bucketExists(bucketName); if (flag) { Iterable<Result<Item>> myObjects = listObjects(bucketName); for (Result<Item> result : myObjects) { Item item = result.get(); listObjectNames.add(item.objectName()); } } return listObjectNames; } /** * ååºå卿¡¶ä¸çææå¯¹è±¡ * * @param bucketName å卿¡¶åç§° * @return Iterable<Result < Item>> */ public Iterable<Result<Item>> listObjects(String bucketName) throws Exception { boolean flag = bucketExists(bucketName); if (flag) { return minioClient.listObjects(ListObjectsArgs.builder().bucket(bucketName).build()); } return null; } /** * éè¿æä»¶ä¸ä¼ å°å¯¹è±¡ * * @param bucketName å卿¡¶åç§° * @param objectName å卿¡¶éç对象åç§° * @param fileName File name * @return boolean */ public boolean uploadObject(String bucketName, String objectName, String fileName) throws Exception { boolean flag = bucketExists(bucketName); if (flag) { minioClient.uploadObject(UploadObjectArgs.builder().bucket(bucketName).object(objectName).filename(fileName).build()); ObjectStat statObject = statObject(bucketName, objectName); if (statObject != null && statObject.length() > 0) { return true; } } return false; } /** * æä»¶ä¸ä¼ * * @param bucketName å卿 åç§° * @param multipartFile æä»¶ * @param filename æä»¶å */ public void putObject(String bucketName, MultipartFile multipartFile, String filename) throws Exception { PutObjectOptions putObjectOptions = new PutObjectOptions(multipartFile.getSize(), PutObjectOptions.MIN_MULTIPART_SIZE); putObjectOptions.setContentType(multipartFile.getContentType()); minioClient.putObject(PutObjectArgs.builder().bucket(bucketName).object(filename).stream(multipartFile.getInputStream(), multipartFile.getSize(), -1).contentType(multipartFile.getContentType()).build()); } /** * éè¿InputStreamä¸ä¼ 对象 * * @param bucketName å卿¡¶åç§° * @param objectName å卿¡¶éç对象åç§° * @param inputStream è¦ä¸ä¼ çæµ * @param contentType ä¸ä¼ çæä»¶ç±»å ä¾å¦ video/mp4 image/jpg * @return boolean */ public boolean putObject(String bucketName, String objectName, InputStream inputStream, String contentType) throws Exception { boolean flag = bucketExists(bucketName); if (flag) { minioClient.putObject(PutObjectArgs.builder().bucket(bucketName).object(objectName).stream( //䏿¸ æ¥æä»¶ç大尿¶ï¼å¯ä»¥ä¼ -1ï¼10485760ã妿ç¥é大å°ä¹å¯ä»¥ä¼ å ¥sizeï¼partsizeã inputStream, -1, 10485760).contentType(contentType).build()); ObjectStat statObject = statObject(bucketName, objectName); if (statObject != null && statObject.length() > 0) { return true; } } return false; } /** * 以æµçå½¢å¼è·åä¸ä¸ªæä»¶å¯¹è±¡ * * @param bucketName å卿¡¶åç§° * @param objectName å卿¡¶éç对象åç§° * @return InputStream */ public InputStream getObject(String bucketName, String objectName) throws Exception { boolean flag = bucketExists(bucketName); if (flag) { ObjectStat statObject = statObject(bucketName, objectName); if (statObject != null && statObject.length() > 0) { InputStream stream = minioClient.getObject(GetObjectArgs.builder().bucket(bucketName).object(objectName).build()); return stream; } } return null; } /** * 以æµçå½¢å¼è·åä¸ä¸ªæä»¶å¯¹è±¡ï¼æç¹ä¸è½½ï¼ * * @param bucketName å卿¡¶åç§° * @param objectName å卿¡¶éç对象åç§° * @param offset èµ·å§åèçä½ç½® * @param length è¦è¯»åçé¿åº¦ (å¯éï¼å¦ææ å¼åä»£è¡¨è¯»å°æä»¶ç»å°¾) * @return InputStream */ public InputStream getObject(String bucketName, String objectName, long offset, Long length) throws Exception { boolean flag = bucketExists(bucketName); if (flag) { ObjectStat statObject = statObject(bucketName, objectName); if (statObject != null && statObject.length() > 0) { InputStream stream = minioClient.getObject(GetObjectArgs.builder().bucket(bucketName).object(objectName).offset(1024L).length(4096L).build()); return stream; } } return null; } /** * ä¸è½½å¹¶å°æä»¶ä¿åå°æ¬å° * * @param bucketName å卿¡¶åç§° * @param objectName å卿¡¶éç对象åç§° * @param fileName File name * @return boolean */ public boolean downloadObject(String bucketName, String objectName, String fileName) throws Exception { boolean flag = bucketExists(bucketName); if (flag) { ObjectStat statObject = statObject(bucketName, objectName); if (statObject != null && statObject.length() > 0) { minioClient.downloadObject(DownloadObjectArgs.builder().bucket(bucketName).object(objectName).filename(fileName).build()); return true; } } return false; } /** * å é¤ä¸ä¸ªå¯¹è±¡ * * @param bucketName å卿¡¶åç§° * @param objectName å卿¡¶éç对象åç§° */ public boolean removeObject(String bucketName, String objectName) throws Exception { boolean flag = bucketExists(bucketName); if (flag) { minioClient.removeObject(RemoveObjectArgs.builder().bucket(bucketName).object(objectName).build()); return true; } return false; } /** * å 餿宿¡¶çå¤ä¸ªæä»¶å¯¹è±¡,è¿åå é¤é误ç对象å表ï¼å ¨é¨å 餿åï¼è¿å空å表 * * @param bucketName å卿¡¶åç§° * @param objectNames 嫿è¦å é¤çå¤ä¸ªobjectåç§°çè¿ä»£å¨å¯¹è±¡ * @return eg: * List<DeleteObject> objects = new LinkedList<>(); * objects.add(new DeleteObject("my-objectname1")); * objects.add(new DeleteObject("my-objectname2")); * objects.add(new DeleteObject("my-objectname3")); */ public List<String> removeObjects(String bucketName, List<DeleteObject> objectNames) throws Exception { List<String> deleteErrorNames = new ArrayList<>(); boolean flag = bucketExists(bucketName); if (flag) { Iterable<Result<DeleteError>> results = minioClient.removeObjects(RemoveObjectsArgs.builder().bucket(bucketName).objects(objectNames).build()); for (Result<DeleteError> result : results) { DeleteError error = result.get(); deleteErrorNames.add(error.objectName()); } } return deleteErrorNames; } /** * çæä¸ä¸ªç»HTTP GET请æ±ç¨çpresigned URLã * æµè§å¨/ç§»å¨ç«¯ç客æ·ç«¯å¯ä»¥ç¨è¿ä¸ªURLè¿è¡ * ï¼å³ä½¿å ¶æå¨çå卿¡¶æ¯ç§æçãè¿ä¸ªpresigned URLå¯ä»¥è®¾ç½®ä¸ä¸ªå¤±ææ¶é´ï¼é»è®¤å¼æ¯999999天ã * * @param bucketName å卿¡¶åç§° * @param objectName å卿¡¶éç对象åç§° * @param expires å¤±ææ¶é´ï¼ä»¥ç§ä¸ºåä½ï¼ï¼é»è®¤æ¯999999天ï¼ä¸å¾å¤§äº999999天 * @return */ public String getPresignedObjectUrl(String bucketName, String objectName, Integer expires) throws Exception { boolean flag = bucketExists(bucketName); String url = ""; if (flag) { if (expires < 1 || expires > DEFAULT_EXPIRY_TIME) { throw new InvalidExpiresRangeException(expires, "expires must be in range of 1 to " + DEFAULT_EXPIRY_TIME); } try { url = minioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder().method(Method.GET).bucket(bucketName).object(objectName).expiry(expires)//卿忰 // .expiry(24 * 60 * 60)//ç¨ç§æ¥è®¡ç®ä¸å¤©æ¶é´æææ // .expiry(1, TimeUnit.DAYS)//æå¤©ä¼ å // .expiry(1, TimeUnit.HOURS)//æå°æ¶ä¼ åæ° .build()); } catch (ErrorResponseException | InsufficientDataException | InternalException | InvalidBucketNameException | InvalidExpiresRangeException | InvalidKeyException | InvalidResponseException | IOException | NoSuchAlgorithmException | ServerException | XmlParserException e) { e.printStackTrace(); } } return url; } /** * çæä¸ä¸ªç»HTTP PUT请æ±ç¨çpresigned URLã * æµè§å¨/ç§»å¨ç«¯ç客æ·ç«¯å¯ä»¥ç¨è¿ä¸ªURLè¿è¡ä¸ä¼ ï¼å³ä½¿å ¶æå¨çå卿¡¶æ¯ç§æçãè¿ä¸ªpresigned URLå¯ä»¥è®¾ç½®ä¸ä¸ªå¤±ææ¶é´ï¼é»è®¤å¼æ¯7天ã * * @param bucketName å卿¡¶åç§° * @param objectName å卿¡¶éç对象åç§° * @param expires å¤±ææ¶é´ï¼ä»¥ç§ä¸ºåä½ï¼ï¼é»è®¤æ¯7天ï¼ä¸å¾å¤§äºä¸å¤© * @return String */ public String presignedPutObject(String bucketName, String objectName, Integer expires) throws Exception { boolean flag = bucketExists(bucketName); String url = ""; if (flag) { if (expires < 1 || expires > DEFAULT_EXPIRY_TIME) { try { throw new InvalidExpiresRangeException(expires, "expires must be in range of 1 to " + DEFAULT_EXPIRY_TIME); } catch (InvalidExpiresRangeException e) { e.printStackTrace(); } } try { url = minioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder().method(Method.PUT).bucket(bucketName).object(objectName).expiry(expires)//卿忰 // .expiry(24 * 60 * 60)//ç¨ç§æ¥è®¡ç®ä¸å¤©æ¶é´æææ // .expiry(1, TimeUnit.DAYS)//æå¤©ä¼ å // .expiry(1, TimeUnit.HOURS)//æå°æ¶ä¼ åæ° .build()); } catch (ErrorResponseException | InsufficientDataException e) { e.printStackTrace(); } catch (InternalException e) { log.error("InternalException", e); } catch (InvalidBucketNameException e) { log.error("InvalidBucketNameException", e); } catch (InvalidExpiresRangeException e) { log.error("InvalidExpiresRangeException", e); } catch (InvalidKeyException e) { log.error("InvalidKeyException", e); } catch (InvalidResponseException e) { log.error("InvalidResponseException", e); } catch (IOException e) { log.error("IOException", e); } catch (NoSuchAlgorithmException e) { log.error("NoSuchAlgorithmException", e); } catch (ServerException e) { log.error("ServerException", e); } catch (XmlParserException e) { log.error("XmlParserException", e); } } return url; } /** * è·å对象çå æ°æ® * * @param bucketName å卿¡¶åç§° * @param objectName å卿¡¶éç对象åç§° * @return */ public ObjectStat statObject(String bucketName, String objectName) throws Exception { boolean flag = bucketExists(bucketName); if (flag) { ObjectStat statObject = null; statObject = minioClient.statObject(StatObjectArgs.builder().bucket(bucketName).object(objectName).build()); return statObject; } return null; } /** * æä»¶è®¿é®è·¯å¾ * * @param bucketName å卿¡¶åç§° * @param objectName å卿¡¶éç对象åç§° * @return String */ public String getObjectUrl(String bucketName, String objectName) throws Exception { boolean flag = bucketExists(bucketName); String url = ""; if (flag) { try { url = minioClient.getObjectUrl(bucketName, objectName); } catch (ErrorResponseException e) { log.error("XmlParserException", e); } catch (InsufficientDataException e) { log.error("InsufficientDataException", e); } catch (InternalException e) { log.error("InternalException", e); } catch (InvalidKeyException e) { log.error("InvalidKeyException", e); } catch (InvalidResponseException e) { log.error("InvalidResponseException", e); } catch (IOException e) { log.error("IOException", e); } catch (NoSuchAlgorithmException e) { log.error("NoSuchAlgorithmException", e); } catch (ServerException e) { log.error("ServerException", e); } catch (XmlParserException e) { log.error("XmlParserException", e); } } return url; } public void downloadFile(String bucketName, String fileName, String originalName, HttpServletResponse response) { try { InputStream file = minioClient.getObject(GetObjectArgs.builder().bucket(bucketName).object(fileName).build()); String filename = new String(fileName.getBytes("ISO8859-1"), StandardCharsets.UTF_8); if (StringUtils.isNotEmpty(originalName)) { fileName = originalName; } response.setHeader("Content-Disposition", "attachment;filename=" + filename); ServletOutputStream servletOutputStream = response.getOutputStream(); int len; byte[] buffer = new byte[1024]; while ((len = file.read(buffer)) > 0) { servletOutputStream.write(buffer, 0, len); } servletOutputStream.flush(); file.close(); servletOutputStream.close(); } catch (ErrorResponseException e) { log.error("ErrorResponseException", e); } catch (Exception e) { log.error("Exception", e); } } } smartor/src/main/java/com/smartor/domain/MinioFile.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,77 @@ package com.smartor.domain; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; import com.ruoyi.common.annotation.Excel; import com.ruoyi.common.core.domain.BaseEntity; /** * ã请填ååè½åç§°ã对象 minio_file * * @author ruoyi * @date 2023-06-19 */ @Data @ApiModel(value = "MinioFile", description = "æ ç¾å类对象") public class MinioFile extends BaseEntity { private static final long serialVersionUID = 1L; /** * æä»¶id */ @ApiModelProperty(value = "æä»¶id") private Long id; /** * åå§æä»¶åç§° */ @Excel(name = "åå§æä»¶åç§°") @ApiModelProperty(value = "åå§æä»¶åç§°") private String originalFileName; /** * æä»¶æå±å */ @Excel(name = "æä»¶æå±å") @ApiModelProperty(value = "æä»¶æå±å") private String fileExtName; /** * æä»¶å¤§å°(åä½ï¼åèï¼ */ @Excel(name = "æä»¶å¤§å°(åä½ï¼åèï¼") @ApiModelProperty(value = "æä»¶å¤§å°(åä½ï¼åèï¼") private Long fileSize; /** * åå ¥minioæ¶çæä»¶åç§° */ @Excel(name = "åå ¥minioæ¶çæä»¶åç§°") @ApiModelProperty(value = "åå ¥minioæ¶çæä»¶åç§°") private String fileName; /** * æä»¶çcontent-type */ @Excel(name = "æä»¶çcontent-type") @ApiModelProperty(value = "æä»¶çcontent-type") private String mime; /** * æä»¶è·¯å¾ */ @Excel(name = "æä»¶è·¯å¾") @ApiModelProperty(value = "æä»¶è·¯å¾") private String fileUrl; /** * æ¯å¦å é¤ 0 å¦ 1 æ¯ */ @Excel(name = "æ¯å¦å é¤ 0 å¦ 1 æ¯") @ApiModelProperty(value = "æ¯å¦å é¤ 0 å¦ 1 æ¯") private Integer isDelete; } smartor/src/main/java/com/smartor/domain/MinioResponseDTO.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,15 @@ package com.smartor.domain; import io.swagger.annotations.ApiModel; import lombok.Data; @Data @ApiModel(value = "MinioResponseDTO", description = "æ ç¾å类对象") public class MinioResponseDTO { private Long fileId; private String fileUrl; private String originalFileName; } smartor/src/main/java/com/smartor/domain/PatArchiveReq.java
@@ -48,7 +48,7 @@ * æ ç¾ID */ @ApiModelProperty("æ ç¾ID") private String tagId; private List<String> tagIds; } smartor/src/main/java/com/smartor/domain/TreeNode.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,31 @@ package com.smartor.domain; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import org.apache.commons.lang3.ObjectUtils; import java.util.ArrayList; import java.util.List; @ApiModel(value = "TreeNode", description = "èç¹æ ") @Data public class TreeNode { @ApiModelProperty(name = "èç¹åç§°") private String name; @ApiModelProperty(name = "åèç¹éå") private List<TreeNode> children; public TreeNode(String name) { this.name = name; this.children = new ArrayList<>(); } public void addChild(TreeNode child) { children.add(child); } } smartor/src/main/java/com/smartor/mapper/MinioFileMapper.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,63 @@ package com.smartor.mapper; import com.smartor.domain.MinioFile; import org.apache.ibatis.annotations.Mapper; import java.util.List; /** * ã请填ååè½åç§°ãMapperæ¥å£ * * @author ruoyi * @date 2023-06-19 */ @Mapper public interface MinioFileMapper { /** * æ¥è¯¢ã请填ååè½åç§°ã * * @param id ã请填ååè½åç§°ãä¸»é® * @return ã请填ååè½åç§°ã */ public MinioFile selectMinioFileById(Long id); /** * æ¥è¯¢ã请填ååè½åç§°ãå表 * * @param minioFile ã请填ååè½åç§°ã * @return ã请填ååè½åç§°ãéå */ public List<MinioFile> selectMinioFileList(MinioFile minioFile); /** * æ°å¢ã请填ååè½åç§°ã * * @param minioFile ã请填ååè½åç§°ã * @return ç»æ */ public int insertMinioFile(MinioFile minioFile); /** * ä¿®æ¹ã请填ååè½åç§°ã * * @param minioFile ã请填ååè½åç§°ã * @return ç»æ */ public int updateMinioFile(MinioFile minioFile); /** * å é¤ã请填ååè½åç§°ã * * @param id ã请填ååè½åç§°ãä¸»é® * @return ç»æ */ public int deleteMinioFileById(Long id); /** * æ¹éå é¤ã请填ååè½åç§°ã * * @param ids éè¦å é¤çæ°æ®ä¸»é®éå * @return ç»æ */ public int deleteMinioFileByIds(Long[] ids); } smartor/src/main/java/com/smartor/service/IMinioFileService.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,96 @@ package com.smartor.service; import com.smartor.domain.MinioFile; import com.smartor.domain.MinioResponseDTO; import com.smartor.domain.TreeNode; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; import java.io.InputStream; import java.util.List; /** * ã请填ååè½åç§°ãServiceæ¥å£ * * @author ruoyi * @date 2023-06-19 */ public interface IMinioFileService { /** * æ¥è¯¢ã请填ååè½åç§°ã * * @param id ã请填ååè½åç§°ãä¸»é® * @return ã请填ååè½åç§°ã */ public MinioFile selectMinioFileById(Long id); /** * æ¥è¯¢ã请填ååè½åç§°ãå表 * * @param minioFile ã请填ååè½åç§°ã * @return ã请填ååè½åç§°ãéå */ public List<MinioFile> selectMinioFileList(MinioFile minioFile); /** * æ°å¢ã请填ååè½åç§°ã * * @param minioFile ã请填ååè½åç§°ã * @return ç»æ */ public int insertMinioFile(MinioFile minioFile); /** * ä¿®æ¹ã请填ååè½åç§°ã * * @param minioFile ã请填ååè½åç§°ã * @return ç»æ */ public int updateMinioFile(MinioFile minioFile); /** * æ¹éå é¤ã请填ååè½åç§°ã * * @param ids éè¦å é¤çã请填ååè½åç§°ã主é®éå * @return ç»æ */ public int deleteMinioFileByIds(Long[] ids); /** * å é¤ã请填ååè½åç§°ãä¿¡æ¯ * * @param id ã请填ååè½åç§°ãä¸»é® * @return ç»æ */ public int deleteMinioFileById(Long id); /** * æä»¶æ¹éä¸ä¼ * * @param files * @return */ public List<MinioResponseDTO> commonUploadFile(String path, List<MultipartFile> files); /** * è·åï¼å®£æï¼å¼ç¨æ¨¡æ¿ * * @param * @return */ public TreeNode getEduTemplage(); /** * @param fileName å ¨è·¯å¾æä»¶å * @return */ public void downloadFile(HttpServletResponse response, String fileName); /** * è·åå¾çãé³é¢ãè§é¢ çURL, å ¥åçfileNameä¸ºå ¨è·¯å¾æä»¶å * * @param fileName * @return */ public String getFileUrl(String fileName, Integer expires); } smartor/src/main/java/com/smartor/service/impl/MinioFileServiceImpl.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,246 @@ package com.smartor.service.impl; import cn.hutool.core.io.FileUtil; import com.ruoyi.common.config.MinioConfig; import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.MinioClientUtils; import com.ruoyi.common.utils.StringUtils; import com.smartor.domain.MinioFile; import com.smartor.domain.MinioResponseDTO; import com.smartor.domain.TreeNode; import com.smartor.mapper.MinioFileMapper; import com.smartor.service.IMinioFileService; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.RandomStringUtils; import org.apache.commons.lang3.math.NumberUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.time.Instant; import java.util.ArrayList; import java.util.List; /** * ã请填ååè½åç§°ãServiceä¸å¡å±å¤ç * * @author ruoyi * @date 2023-06-19 */ @Slf4j @Service public class MinioFileServiceImpl implements IMinioFileService { @Autowired private MinioFileMapper minioFileMapper; @Resource private MinioClientUtils minioClientUtils; @Resource private MinioConfig minioConfig; /** * æ¥è¯¢ã请填ååè½åç§°ã * * @param id ã请填ååè½åç§°ãä¸»é® * @return ã请填ååè½åç§°ã */ @Override public MinioFile selectMinioFileById(Long id) { return minioFileMapper.selectMinioFileById(id); } /** * æ¥è¯¢ã请填ååè½åç§°ãå表 * * @param minioFile ã请填ååè½åç§°ã * @return ã请填ååè½åç§°ã */ @Override public List<MinioFile> selectMinioFileList(MinioFile minioFile) { return minioFileMapper.selectMinioFileList(minioFile); } /** * æ°å¢ã请填ååè½åç§°ã * * @param minioFile ã请填ååè½åç§°ã * @return ç»æ */ @Override public int insertMinioFile(MinioFile minioFile) { minioFile.setCreateTime(DateUtils.getNowDate()); return minioFileMapper.insertMinioFile(minioFile); } /** * ä¿®æ¹ã请填ååè½åç§°ã * * @param minioFile ã请填ååè½åç§°ã * @return ç»æ */ @Override public int updateMinioFile(MinioFile minioFile) { minioFile.setUpdateTime(DateUtils.getNowDate()); return minioFileMapper.updateMinioFile(minioFile); } /** * æ¹éå é¤ã请填ååè½åç§°ã * * @param ids éè¦å é¤çã请填ååè½åç§°ãä¸»é® * @return ç»æ */ @Override public int deleteMinioFileByIds(Long[] ids) { return minioFileMapper.deleteMinioFileByIds(ids); } /** * å é¤ã请填ååè½åç§°ãä¿¡æ¯ * * @param id ã请填ååè½åç§°ãä¸»é® * @return ç»æ */ @Override public int deleteMinioFileById(Long id) { return minioFileMapper.deleteMinioFileById(id); } @Override public List<MinioResponseDTO> commonUploadFile(String path, List<MultipartFile> files) { log.info(files.toString()); if (StringUtils.isNotEmpty(path) && !path.endsWith("/")) { path = path + "/"; } List<MinioResponseDTO> MinioResponseDTOList = new ArrayList<>(); for (MultipartFile file : files) { String originalFilename = file.getOriginalFilename(); // è·åæä»¶æå±å String extName = FileUtil.extName(originalFilename); log.info("æä»¶æå±å:" + extName); // çææ°çæä»¶åï¼åå ¥å°minio long millSeconds = Instant.now().toEpochMilli(); String minioFileName = millSeconds + RandomStringUtils.randomNumeric(12) + "." + extName; String contentType = file.getContentType(); log.info("æä»¶mime:{}", contentType); // è¿åæä»¶å¤§å°,åä½åè long size = file.getSize(); log.info("æä»¶å¤§å°ï¼" + size); try { String bucketName = minioConfig.getBucketName(); minioClientUtils.putObject(bucketName, file, path + originalFilename); // String fileUrl = minioClientUtils.getObjectUrl(bucketName, path + originalFilename); String fileUrl = path + originalFilename; MinioFile minioFile = new MinioFile(); minioFile.setOriginalFileName(originalFilename); minioFile.setFileExtName(extName); minioFile.setFileName(originalFilename); minioFile.setFileSize(size); minioFile.setMime(contentType); minioFile.setIsDelete(NumberUtils.INTEGER_ZERO); minioFile.setFileUrl(fileUrl); int i = insertMinioFile(minioFile); if (i > 0) { MinioResponseDTO minioResponseDTO = new MinioResponseDTO(); minioResponseDTO.setFileId(minioFile.getId()); minioResponseDTO.setOriginalFileName(originalFilename); minioResponseDTO.setFileUrl(fileUrl); MinioResponseDTOList.add(minioResponseDTO); } } catch (Exception e) { log.error("ä¸ä¼ æä»¶åºé:{}", e); } } return MinioResponseDTOList; } @Override public TreeNode getEduTemplage() { List<MinioFile> minioFiles = minioFileMapper.selectMinioFileList(null); TreeNode root = new TreeNode(""); // 使ç¨éå½å°åè¡¨è½¬ææ å¼ç»æ for (MinioFile minioFile1 : minioFiles) { String[] parts = minioFile1.getFileUrl().split("/"); TreeNode current = root; for (String part : parts) { if (!part.isEmpty()) { TreeNode child = findChild(current, part); if (child == null) { child = new TreeNode(part); current.addChild(child); } current = child; } } } return root; } @Override public void downloadFile(HttpServletResponse response, String fileName) { InputStream object = null; try { object = minioClientUtils.getObject(minioConfig.getBucketName(), fileName); writeFile(response, object); } catch (Exception e) { log.info("æä»¶ä¸è½½ï¼æ¥éäºï¼ï¼ï¼{}", fileName); e.printStackTrace(); } } @Override public String getFileUrl(String fileName, Integer expires) { String presignedObjectUrl = null; try { presignedObjectUrl = minioClientUtils.getPresignedObjectUrl(minioConfig.getBucketName(), fileName, expires); //廿urlé?åé¢ç请æ±ä¿¡æ¯ presignedObjectUrl = presignedObjectUrl.substring(0, presignedObjectUrl.lastIndexOf("?")); } catch (Exception e) { log.info("æä»¶ä¸è½½ï¼æ¥éäºï¼ï¼ï¼{}, {}", fileName, expires); e.printStackTrace(); } return presignedObjectUrl; } private TreeNode findChild(TreeNode parent, String name) { for (TreeNode child : parent.getChildren()) { if (child.getName().equals(name)) { return child; } } return null; } public void writeFile(HttpServletResponse resp, InputStream inputStream) { OutputStream out = null; try { out = resp.getOutputStream(); int len = 0; byte[] b = new byte[1024]; while ((len = inputStream.read(b)) != -1) { out.write(b, 0, len); } out.flush(); } catch (IOException e) { e.printStackTrace(); } finally { try { if (out != null) { out.close(); } } catch (Exception e) { e.printStackTrace(); } } } } smartor/src/main/resources/mapper/smartor/BaseTagcategoryMapper.xml
@@ -132,10 +132,10 @@ a.upload_time, a.categoryname, count(b.tagid) as tagNum from base_tagcategory a,base_tag b from base_tagcategory a left join base_tag b on a.tagcategoryid = b.tagcategoryid <where> a.tagcategoryid = b.tagcategoryid <if test="categoryname != null and categoryname != ''">and a.categoryname like concat('%', #{categoryname}, <if test="categoryname != null and categoryname != ''">a.categoryname like concat('%', #{categoryname}, '%') </if> </where> smartor/src/main/resources/mapper/smartor/MinioFileMapper.xml
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,122 @@ <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.smartor.mapper.MinioFileMapper"> <resultMap type="com.smartor.domain.MinioFile" id="MinioFileResult"> <result property="id" column="id"/> <result property="originalFileName" column="original_file_name"/> <result property="fileExtName" column="file_ext_name"/> <result property="fileSize" column="file_size"/> <result property="fileName" column="file_name"/> <result property="mime" column="mime"/> <result property="fileUrl" column="file_url"/> <result property="isDelete" column="is_delete"/> <result property="createBy" column="create_by"/> <result property="createTime" column="create_time"/> <result property="updateBy" column="update_by"/> <result property="updateTime" column="update_time"/> </resultMap> <sql id="selectMinioFileVo"> select id, original_file_name, file_ext_name, file_size, file_name, mime, file_url, is_delete, create_by, create_time, update_by, update_time from minio_file </sql> <select id="selectMinioFileList" parameterType="com.smartor.domain.MinioFile" resultMap="MinioFileResult"> <include refid="selectMinioFileVo"/> <where> <if test="originalFileName != null and originalFileName != ''">and original_file_name like concat('%', #{originalFileName}, '%') </if> <if test="fileExtName != null and fileExtName != ''">and file_ext_name like concat('%', #{fileExtName}, '%') </if> <if test="fileSize != null ">and file_size = #{fileSize}</if> <if test="fileName != null and fileName != ''">and file_name like concat('%', #{fileName}, '%')</if> <if test="mime != null and mime != ''">and mime = #{mime}</if> <if test="fileUrl != null and fileUrl != ''">and file_url = #{fileUrl}</if> <if test="isDelete != null ">and is_delete = #{isDelete}</if> </where> </select> <select id="selectMinioFileById" parameterType="Long" resultMap="MinioFileResult"> <include refid="selectMinioFileVo"/> where id = #{id} </select> <insert id="insertMinioFile" parameterType="com.smartor.domain.MinioFile"> insert into minio_file <trim prefix="(" suffix=")" suffixOverrides=","> <if test="id != null">id,</if> <if test="originalFileName != null">original_file_name,</if> <if test="fileExtName != null">file_ext_name,</if> <if test="fileSize != null">file_size,</if> <if test="fileName != null">file_name,</if> <if test="mime != null">mime,</if> <if test="fileUrl != null">file_url,</if> <if test="isDelete != null">is_delete,</if> <if test="createBy != null">create_by,</if> <if test="createTime != null">create_time,</if> <if test="updateBy != null">update_by,</if> <if test="updateTime != null">update_time,</if> </trim> <trim prefix="values (" suffix=")" suffixOverrides=","> <if test="id != null">#{id},</if> <if test="originalFileName != null">#{originalFileName},</if> <if test="fileExtName != null">#{fileExtName},</if> <if test="fileSize != null">#{fileSize},</if> <if test="fileName != null">#{fileName},</if> <if test="mime != null">#{mime},</if> <if test="fileUrl != null">#{fileUrl},</if> <if test="isDelete != null">#{isDelete},</if> <if test="createBy != null">#{createBy},</if> <if test="createTime != null">#{createTime},</if> <if test="updateBy != null">#{updateBy},</if> <if test="updateTime != null">#{updateTime},</if> </trim> </insert> <update id="updateMinioFile" parameterType="com.smartor.domain.MinioFile"> update minio_file <trim prefix="SET" suffixOverrides=","> <if test="originalFileName != null">original_file_name = #{originalFileName},</if> <if test="fileExtName != null">file_ext_name = #{fileExtName},</if> <if test="fileSize != null">file_size = #{fileSize},</if> <if test="fileName != null">file_name = #{fileName},</if> <if test="mime != null">mime = #{mime},</if> <if test="fileUrl != null">file_url = #{fileUrl},</if> <if test="isDelete != null">is_delete = #{isDelete},</if> <if test="createBy != null">create_by = #{createBy},</if> <if test="createTime != null">create_time = #{createTime},</if> <if test="updateBy != null">update_by = #{updateBy},</if> <if test="updateTime != null">update_time = #{updateTime},</if> </trim> where id = #{id} </update> <delete id="deleteMinioFileById" parameterType="Long"> delete from minio_file where id = #{id} </delete> <delete id="deleteMinioFileByIds" parameterType="String"> delete from minio_file where id in <foreach item="id" collection="array" open="(" separator="," close=")"> #{id} </foreach> </delete> </mapper> smartor/src/main/resources/mapper/smartor/PatArchiveMapper.xml
@@ -88,7 +88,11 @@ <if test="name != null and name != ''">and a.name like concat('%', #{name}, '%')</if> <if test="iccardno != null and iccardno != ''">and iccardno = #{iccardno}</if> <if test="telcode != null and telcode != ''">and telcode = #{telcode}</if> <if test="tagId != null and tagId != ''">and c.tagid = #{tagId}</if> <if test="tagIds != null and tagIds != ''">and c.tagid in <foreach collection="tagIds" item="tagId" open="(" separator="," close=")"> #{tagId} </foreach> </if> </where> </select> @@ -97,7 +101,8 @@ where patid = #{patid} </select> <insert id="insertPatArchive" parameterType="com.smartor.domain.PatArchive" useGeneratedKeys="true" keyProperty="patid"> <insert id="insertPatArchive" parameterType="com.smartor.domain.PatArchive" useGeneratedKeys="true" keyProperty="patid"> insert into pat_archive <trim prefix="(" suffix=")" suffixOverrides=","> <if test="name != null">name,</if>