<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      SpringBoot項目集成Minio

      一、Minio的下載安裝以及基本使用

      1.下載地址:https://dl.min.io/server/minio/release/windows-amd64/minio.exe

      2.下載好后需要手動創建【data】文件夾用于存儲Minio中的數據


      3.在對應文件路徑處,鍵入【cmd】 后設置Minio的一些變量(第一次啟動需要配置)

      set MINIO_ROOT_USER=admin
      
      set MINIO_ROOT_PASSWORD=admin123
      
      set MINIO_ACCESS_KEY=admin
      
      set MINIO_SECRET_KEY=admin123

      5.下面是我踩的坑,如果只設置了MINIO_ROOT_USER和MINIO_ROOT_PASSWORD的值,而不設置MINIO_ACCESS_KEY和MINIO_SECRET_KEY的值,當啟動minio服務的時候就會報以下異常:

      6. 啟動minio服務

      minio.exe server data

       7.進入登錄頁面后,輸入對應的用戶名和密碼,也就是之前設置的MINIO_ROOT_USER和MINIO_ROOT_PASSWORD的值。

      8. 進入主界面后,點擊左側導航欄中的Buckets,然后點擊Create Bucket。

       9.進入該桶,點擊upload,上傳一個文件

       10.點擊左側導航欄中的Buckets,進入該桶,修改權限為public,這樣外界就可以訪問上傳的文件了。

      桶的默認權限是private,所以外界訪問不到,需要修改訪問權限為public,但是要注意安全問題

      二. springboot集成minio

      1.引入依賴

      <dependency>
        <groupId>io.minio</groupId>
        <artifactId>minio</artifactId>
        <version>7.0.2</version>
      </dependency>
      <dependency>
         <groupId>org.projectlombok</groupId>
         <artifactId>lombok</artifactId>
         <version>1.18.20</version>
      </dependency>

      2.編寫配置文件

      server:
       port: 8080
      spring:
       # 配置文件上傳大小限制
       servlet:
        multipart:
         max-file-size: 200MB
         max-request-size: 200MB
      minio:
       host: http://127.0.0.1:9000 # 訪問地址
       url: ${minio.host}/${minio.bucket}/  # 對象存儲服務的url
       access-key: minioadmin # 登錄賬號
       secret-key: minioadmin # 登錄賬號密碼
       bucketName: test-bucket # 文件桶的名稱
       bucket: public  // 權限

      3.編寫minio配置類

      @Configuration
      public class MinIoClientConfig {
          /**
           * minio配置
           */
          @Value("${minio.url}")
          private String endpoint;
          @Value("${minio.accessKey}")
          private String accessKey;
          @Value("${minio.secretKey}")
          private String secretKey;
          @Value("${minio.bucketName}")
          private String bucketName;
      
          /**
           * 注入minio客戶端
           *
           * @return minio客戶端對象
           */
          @Bean
          public MinioClient minioClient() {
              return MinioClient.builder().endpoint(endpoint).credentials(accessKey, secretKey).build();
          }
      }

      4.編寫minio工具類

      package com.xuyaxu.until;
      
      import com.xuyaxu.entity.Fileinfo;
      import io.minio.*;
      import io.minio.http.Method;
      import io.minio.messages.Bucket;
      import io.minio.messages.Item;
      import org.springframework.beans.factory.annotation.Autowired;
      import org.springframework.beans.factory.annotation.Value;
      import org.springframework.stereotype.Component;
      
      import java.io.InputStream;
      import java.util.ArrayList;
      import java.util.List;
      
      @Component
      public class MinioUtil {
      
          /**
           * minio配置
           */
          @Value("${minio.url}")
          private String endpoint;
      
          @Autowired
          private MinioClient minioClient;
          
          /**
           * 創建一個桶
           */
          public void createBucket(String bucket) throws Exception {
              boolean found = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucket).build());
              if (!found) {
                  minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucket).build());
              }
          }
          
          /**
           * 上傳一個文件
           */
          public String uploadFile(InputStream stream, String bucket, String objectName) throws Exception {
              ObjectWriteResponse objectWriteResponse = minioClient.putObject(PutObjectArgs.builder().bucket(bucket).object(objectName)
                      .stream(stream, -1, 10485760).build());
              return endpoint + "/" + bucket + "/" + objectWriteResponse.object();
          }
          
          /**
           * 列出所有的桶
           */
          public List<String> listBuckets() throws Exception {
              List<Bucket> list = minioClient.listBuckets();
              List<String> names = new ArrayList<>();
              list.forEach(b -> {
                  names.add(b.name());
              });
              return names;
          }
          
          /**
           * 列出一個桶中的所有文件和目錄
           */
          public List<Fileinfo> listFiles(String bucket) throws Exception {
              Iterable<Result<Item>> results = minioClient.listObjects(
                      ListObjectsArgs.builder().bucket(bucket).recursive(true).build());
                  
                  List<Fileinfo> infos = new ArrayList<>();
                      results.forEach(r->{
                          Fileinfo info = new Fileinfo();
                          try {
                              Item item = r.get();
                              info.setFilename(item.objectName());
                              info.setDirectory(item.isDir());
                              info.setFilepath(endpoint+"/"+bucket+"/"+item.objectName());
                              infos.add(info);
                          } catch (Exception e) {
                              e.printStackTrace();
                          }
                      });
              return infos;
          }
          
          /**
           * 下載一個文件
           */
          public InputStream download(String bucket, String objectName) throws Exception {
              InputStream stream = minioClient.getObject(
                            GetObjectArgs.builder().bucket(bucket).object(objectName).build());
              return stream;
          }
          
          /**
           * 刪除一個桶
           */
          public void deleteBucket(String bucket) throws Exception {
              minioClient.removeBucket(RemoveBucketArgs.builder().bucket(bucket).build());
          }
          
          /**
           * 刪除一個對象
           */
          public void deleteObject(String bucket, String objectName) throws Exception {
              minioClient.removeObject(RemoveObjectArgs.builder().bucket(bucket).object(objectName).build());
          }
      
      
          /**
           * 復制文件
           */
          public void copyObject(String sourceBucket, String sourceObject, String targetBucket, String targetObject) throws Exception {
              this.createBucket(targetBucket);
              minioClient.copyObject(CopyObjectArgs.builder().bucket(targetBucket).object(targetObject)
                      .source(CopySource.builder().bucket(sourceBucket).object(sourceObject).build()).build());
          }
      
          /**
           * 獲取文件信息
           */
          public String getObjectInfo(String bucket, String objectName) throws Exception {
              return minioClient.statObject(StatObjectArgs.builder().bucket(bucket).object(objectName).build()).toString();
      
          }
      
          /**
           * 生成一個給HTTP GET請求用的presigned URL。
           * 瀏覽器/移動端的客戶端可以用這個URL進行下載,
           * 即使其所在的存儲桶是私有的。
           */
          public String getPresignedObjectUrl(String bucketName, String objectName, Integer expires) throws Exception {
              GetPresignedObjectUrlArgs build = GetPresignedObjectUrlArgs
                      .builder().bucket(bucketName).object(objectName).expiry(expires).method(Method.GET).build();
              return minioClient.getPresignedObjectUrl(build);
          }
      
          /**
           * 獲取minio中所有的文件
           */
          public List<Fileinfo> listAllFile() throws Exception {
              List<String> list = this.listBuckets();
              List<Fileinfo> fileinfos = new ArrayList<>();
              for (String bucketName : list) {
                  fileinfos.addAll(this.listFiles(bucketName));
              }
              return fileinfos;
          }
      
      }

       

      5.編寫文件實體類

      @Data
      public class Fileinfo {
          String filename;
          String filepath;
          Boolean directory;
      }

      6.編寫接口響應實體

      @Data
      public class ResultData<T> {
      
          public static final Integer SUCCESS_CODE = 200;
          public static final Integer FAIL_CODE = 4000;
          public static final String SUCCESS_MESSAGE = "操作成功";
          public static final String FAIL_MESSAGE = "操作失敗";
          /**
           * 返回狀態碼
           */
          private Integer code;
          /**
           * 返回信息
           */
          private String message;
      
          /**
           * 返回數據
           */
          private T data;
      
      
          public ResultData() {
      
          }
      
          public static <T> ResultData<T> success() {
              ResultData<T> resultUtil = new ResultData<>();
              resultUtil.setCode(SUCCESS_CODE);
              resultUtil.setMessage(SUCCESS_MESSAGE);
              return resultUtil;
          }
      
          public static <T> ResultData<T> success(T data) {
              ResultData<T> resultUtil = success();
              resultUtil.setData(data);
              return resultUtil;
          }
      
          public static <T> ResultData<T> success(String message, T data) {
              ResultData<T> resultUtil = success();
              resultUtil.setMessage(message);
              resultUtil.setData(data);
              return resultUtil;
          }
      
          public static <T> ResultData<T> success(Integer code, String message, T data) {
              ResultData<T> resultUtil = new ResultData<>();
              resultUtil.setCode(code);
              resultUtil.setMessage(message);
              resultUtil.setData(data);
              return resultUtil;
          }
      
          public static <T> ResultData<T> success(Integer code, String message,Integer count, T data) {
              ResultData<T> resultUtil = new ResultData<>();
              resultUtil.setCode(code);
              resultUtil.setMessage(message);
              resultUtil.setData(data);
              return resultUtil;
          }
      
          public static <T> ResultData<T> fail() {
              ResultData<T> resultUtil = new ResultData<>();
              resultUtil.setCode(FAIL_CODE);
              resultUtil.setMessage(FAIL_MESSAGE);
              return resultUtil;
          }
      
          public static <T> ResultData<T> fail(T data) {
              ResultData<T> resultUtil = fail();
              resultUtil.setData(data);
              return resultUtil;
          }
      
          public static <T> ResultData<T> fail(String message, T data) {
              ResultData<T> resultUtil = fail();
              resultUtil.setMessage(message);
              resultUtil.setData(data);
              return resultUtil;
          }
      
          public static <T> ResultData<T> fail(Integer code, String message) {
              ResultData<T> resultUtil = fail();
              resultUtil.setCode(code);
              resultUtil.setMessage(message);
              return resultUtil;
          }
      
          public static <T> ResultData<T> fail(Integer code, String message, T data) {
              ResultData<T> resultUtil = new ResultData<>();
              resultUtil.setCode(code);
              resultUtil.setMessage(message);
              resultUtil.setData(data);
              return resultUtil;
          }
      
          public void setCode(int code){
              this.code = code;
          }
          public int getCode(){
              return this.code;
          }
          public void setMessage(String message){
              this.message = message;
          }
          public String getMessage(){
              return message;
          }
          public void setData(T data){
              this.data = data;
          }
          public T getData(){
              return data;
          }
      }

      7.創建minio控制器

      package com.xuyaxu.controller;
      
      import com.xuyaxu.config.ResultData;
      import com.xuyaxu.entity.Fileinfo;
      import com.xuyaxu.until.MinioUtil;
      import org.springframework.beans.factory.annotation.Autowired;
      import org.springframework.web.bind.annotation.*;
      import org.springframework.web.multipart.MultipartFile;
      import java.io.InputStream;
      import java.util.List;
      
      
      /**
       * minio相關接口
       *
       * @author songwp
       * @date 2024/10/31 17:51
       */
      @RestController
      @RequestMapping("minio")
      public class MinioController {
      
          @Autowired
          MinioUtil minioUtil;
      
      
          /**
           * 文件上傳
           *
           * @param file 文件
           * @param bucket 桶名
           * @param objectName 對象名
           * @return 是否成功
           * @throws Exception
           */
          @RequestMapping(value = "/upload", method = RequestMethod.POST)
          public ResultData upload(@RequestParam("file") MultipartFile file,
                                   @RequestParam ("bucket") String bucket,
                                   @RequestParam(required = false) String objectName) throws Exception {
              String filePath ="";
              minioUtil.createBucket(bucket);
              if (objectName != null) {
                  filePath = minioUtil.uploadFile(file.getInputStream(), bucket, objectName + "/" + file.getOriginalFilename());
              } else {
                  filePath =minioUtil.uploadFile(file.getInputStream(), bucket, file.getOriginalFilename());
              }
              return ResultData.success(filePath);
          }
      
          /**
           * 獲取文件信息
           * @param bucket 桶名
           * @return 是否成功
           */
          @RequestMapping(value = "/getFile", method = RequestMethod.GET)
          public ResultData getFile(@RequestParam ("bucket")String bucket){
              try {
                  List<Fileinfo> fileinfos = minioUtil.listFiles(bucket);
                  return ResultData.success(fileinfos);
              } catch (Exception e) {
                  throw new RuntimeException(e);
              }
          }
      
      
          /**
           * 文件下載
           *
           * @param bucket 桶名
           * @param objectName 對象名
           * @return 是否成功
           */
          @GetMapping("download")
          public ResultData download(@RequestParam("bucket") String bucket,
                                     @RequestParam("objectName") String objectName){
              try {
                  InputStream download = minioUtil.download(bucket, objectName);
                  return ResultData.success();
              } catch (Exception e) {
                  throw new RuntimeException(e);
              }
          }
      
          /**
           * 獲取文件信息
           *
           * @param bucket 桶名
           * @param objectName 對象名
           * @return 是否成功
           */
          @GetMapping("getObjectInfo")
          public ResultData getObjectInfo(@RequestParam("bucket") String bucket,
                                     @RequestParam("objectName") String objectName) throws Exception {
              String objectInfo = minioUtil.getObjectInfo(bucket, objectName);
              String objectStat = objectInfo.replaceAll("ObjectStat", "");
              return ResultData.success(objectStat);
          }
      
      
          /**
           * 生成一個給HTTP GET請求用的presigned URL。
           *
           * @param bucket 桶名
           * @param objectName 對象名
           * @return 是否成功
           */
          @GetMapping("getObjectUrl")
          public ResultData getObjectUrl(@RequestParam("bucket") String bucket,
                                          @RequestParam("objectName") String objectName) throws Exception {
              String url = minioUtil.getPresignedObjectUrl(bucket, objectName,7200);
              return ResultData.success(url);
          }
      
      
          /**
           * 列出所有的桶
           */
          @RequestMapping(value = "/listBuckets", method = RequestMethod.GET)
          public ResultData listBuckets() throws Exception {
              return ResultData.success(minioUtil.listBuckets());
          }
      
          /**
           * 獲取minio中所有的文件
           */
          @RequestMapping(value = "/listAllFile", method = RequestMethod.GET)
          public ResultData listAllFile() throws Exception {
              return ResultData.success(minioUtil.listAllFile());
          }
      }

      8.通過apiPost調用接口具體實例

      9.最后查看test-bucket桶中是否有剛才上傳的文件就可以了。如果有則表明你的項目已經成功集成minio了

      以上是我對SpringBoot集成Minio的簡單的總結,我這里只展示了上傳的方法,有不到之處敬請大家批評指正!

      posted @ 2024-11-01 11:32  [奮斗]  閱讀(983)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 日本亚洲色大成网站www久久| 在线观看热码亚洲av每日更新| 又爽又黄又无遮挡的视频| 视频网站在线观看不卡| 人妻丝袜AV中文系列先锋影音| 狠狠躁夜夜人人爽天96| 午夜高清福利在线观看| 无码成人精品区在线观看| 熟女人妻精品一区二区视频| 国产精品一码二码三码四码| 亚洲国产色播AV在线| 白嫩少妇无套内谢视频| 婷婷色综合成人成人网小说| 成 人免费va视频| 97欧美精品系列一区二区| 日本人妻巨大乳挤奶水免费| 国产小受被做到哭咬床单GV| 久热中文字幕在线精品观| 三级黄色片一区二区三区| 亚洲最大日韩精品一区| 国产白丝jk捆绑束缚调教视频| 色综合久久婷婷88| 亚洲精品成人区在线观看| 久久精品国产亚洲精品色婷婷| 欧美成人h精品网站| 激情综合网激情五月俺也想| 精品亚洲无人区一区二区| 日韩中文字幕精品人妻| 丰满人妻无码∧v区视频| 台湾佬自拍偷区亚洲综合| 国产成人一区二区不卡| 人人做人人妻人人精| 饥渴少妇高潮正在播放| 亚洲国产精品无码一区二区三区| 国产精品久久久久久亚洲色| 亚洲一区二区三区四区三级视频| 东京热一精品无码av| 亚洲中文字幕一区二区| 性少妇tubevⅰdeos高清| 日韩中文字幕国产精品| 亚洲熟妇无码av另类vr影视|