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

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

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

      minio 對象存儲服務

      Minio 對象存儲

      梗概:本篇文章主要介紹 minio 對象存儲服務的使用;Minio是一個簡單易用的云存儲服務,就像是一個放在網絡上的大文件柜。想象一下,你有一間放滿了各種文件的房間,有時候你需要把這些文件分享給朋友或者在不同地方訪問它們。Minio就是幫你做到這一點的工具,它讓你可以輕松地把文件上傳到互聯網上,這樣無論你在哪里,只要有網絡,就能訪問或分享這些文件。

      1. minio 部署

      minio 部署的方式主要使用的是 docker 部署的方式進行搭建

      docker run -p 9000:9000 -p 9090:9090 \
       --name minio \
       -d --restart=always \
       -e "MINIO_ACCESS_KEY=minioadmin" \
       -e "MINIO_SECRET_KEY=minioadmin" \
       -v /mydata/minio/data:/data \
       minio/minio server \
       /data --console-address ":9090" -address ":9000"
      

      使用 docker 的命令進行 minio 的處理;

      version: '3.8'
      
      services:
        minio:
          # image: minio/minio:latest
          # 其他的版本:RELEASE.2025-02-07T23-21-09Z
          image: minio/minio:RELEASE.2023-03-20T20-16-18Z
          container_name: minio
          ports:
            - "9000:9000"  # API 端口
            - "9090:9090"  # 控制臺端口
          environment:
            MINIO_ROOT_USER: minioadmin  # 管理用戶名
            MINIO_ROOT_PASSWORD: minioadmin  # 管理密碼(生產環境建議修改)
            MINIO_VOLUMES: /data
            MINIO_DEFAULT_BUCKETS: my-bucket  # 創建默認存儲桶
          volumes:
            - minio-data:/data  # 使用命名卷
          command: server /data --console-address ":9090" --address ":9000"
          restart: always
          healthcheck:
            test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
            interval: 30s
            timeout: 20s
            retries: 3
      
      # 使用持久化存儲的服務;
      volumes:
        minio-data:
          driver: local
      

      使用 docker compose 進行啟動

      # 不占用終端的方式進行啟動
      docker compose up -d
      

      image-20250727190537198

      2. minio 使用

      訪問啟動后輸出的地址 http:127.0.0.1:9000使用指定的地址訪問界面創建存儲桶。

      在對象存儲服務里面,所有的文件都是以桶的形式來組織的。簡單說,可以將桶看作是目錄,這個目錄下有很多的文件或者文件夾,這和其它云存儲服務基本一致。

      • 創建存儲桶

        image-20250727191305319

      • 在界面中上傳下載文件

        image-20250727191448630

      • 不同的版本可以進行存儲的訪問策略進行控制;

      • 常見的使用邏輯

        • 上傳文件:首先,你通過Minio提供的接口或者工具,把視頻或圖片上傳到Minio的服務器上。上傳時,你可以設置一些額外的信息,告訴Minio這些文件是可以被公開訪問的。
        • 生成鏈接:當你要在網站上展示這些文件時,Minio能生成一個特殊的網址(我們叫做對象URL)。這個鏈接直接指向存儲在Minio中的視頻或圖片。關鍵在于,這個鏈接可以設置一個有效期,過了時間就失效,保證安全性。
        • 前端顯示:網站的前端代碼(就是瀏覽器能看到的部分)會用這個鏈接去請求Minio服務器上的視頻或圖片。當瀏覽器收到這些文件時,如果它們是圖片,就會直接顯示在頁面上;如果是視頻,則會在頁面上嵌入一個播放器讓用戶觀看。
        • 下載功能:對于下載來說,其實也很簡單。因為前端已經有了這個文件的直接鏈接,用戶點擊“下載”按鈕時,瀏覽器就會使用這個鏈接開始下載文件到用戶的電腦上,就像平時在網上下載東西一樣。

      3. python 使用 minio

      # !/usr/bin/env python
      # -*-coding:utf-8 -*-
      
      """
      @File    : example_minio.py
      @Time    : 2025/7/27 19:41
      @Author  : zi qing bao jian
      @Version : 1.0
      @Desc    : minio 對象存儲服務;
      """
      
      import os
      import uuid
      import time
      
      from minio import Minio
      from minio.datatypes import Bucket
      from minio.error import S3Error
      
      # 配置信息
      ENDPOINT = "192.168.159.129:9000"
      ACCESS_KEY = "minioadmin"
      SECRET_KEY = "minioadmin"
      BUCKET_NAME = "my-learn"
      SECURE = False
      URL_EXPIRATION = 60 * 60 * 24
      
      
      def create_minio_client():
          """
          創建 Minio 客戶端;
          :return:
          """
          return Minio(ENDPOINT, access_key=ACCESS_KEY, secret_key=SECRET_KEY, secure=SECURE)
      
      
      def create_bucket_exists(client, bucket_name):
          """檢查存儲桶是否存在;
          """
          try:
              if not client.bucket_exists(bucket_name):
                  client.make_bucket(bucket_name)
                  print("Bucket {} created.".format(bucket_name))
              else:
                  print("Bucket {} already exists.".format(bucket_name))
          except Exception as e:
              print(f"Bucket {bucket_name} create fail{e}")
      
      
      def generate_unique_filename(origin_filename: str) -> str:
          """
          生成唯一文件名, 避免沖突;
          :param origin_filename:
          :return:
          """
          ext = os.path.splitext(origin_filename)[1]  # 獲取后綴名;
          return f"{uuid.uuid4().hex}{ext}"
      
      
      def upload_file(client, bucket_name, file_path, object_name=None) -> str | None:
          """
          上傳文件到 minio 中;
          :param client:
          :param bucket_name:
          :param file_path:
          :param object_name:
          :return:
          """
          try:
              if not object_name:
                  object_name = generate_unique_filename(os.path.basename(file_path))
                  result = client.fput_object(bucket_name, object_name, file_path)
                  print(f"文件上傳成功, 文件名{object_name}, Etag={result.etag}")
                  return result.object_name
          except S3Error as e:
              print(f"文件上傳失敗{e}")
      
      
      def generate_presigned_url(client, bucket_name, origin_filename, expires=3600) -> str | None:
          """
          生成簽名的 URL, 允許臨時訪問私有對象;
          :param client:
          :param bucket_name:
          :param origin_filename:
          :param expires:
          :return:
          """
          try:
              url = client.presigned_get_object(bucket_name, origin_filename)
              print(f"預簽名URL生成成功 (有效期 {str(expires)} 秒): {url}")
              return url
          except S3Error as e:
              print(f"生成預簽名URL失敗: {e}")
              return None
      
      
      def upload_and_get_url(local_file_path: str) -> str | None:
          """
          上傳文件返回返回可訪問的 URL;
          :param local_file_path:
          :return:
          """
          client = create_minio_client()
          create_bucket_exists(client, BUCKET_NAME)
      
          # 上傳文件;
          object_name = upload_file(client, BUCKET_NAME, local_file_path)
          if not object_name:
              return None
          result = generate_presigned_url(client, BUCKET_NAME, object_name, expires=URL_EXPIRATION)
          return result
      
      
      if __name__ == '__main__':
          # create_minio_client()
          img_path = r"E:\手機文件\2025-06-01遷移\蘇州\蘇州人像\IMG20250410121922.jpg"
          url = upload_and_get_url(img_path)
          # print(url)
          print(url)
      
      

      image-20250727202122293

      繼續努力,終成大器!

      posted @ 2025-07-27 20:28  紫青寶劍  閱讀(17)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 中文字幕日韩国产精品| 国产在线视频www色| 老师破女学生处特级毛ooo片| 中文人妻无码一区二区三区在线| 久久热这里只有精品99| 国产精品剧情亚洲二区| 蜜臀久久综合一本av| 久章草在线毛片视频播放| 四虎影视国产精品永久在线| 蜜桃一区二区三区在线看| 99在线视频免费观看| 国产精品自拍中文字幕| 国产精品久久久久av福利动漫| 久久一亚色院精品全部免费| 国产一区二区三区av在线无码观看| 国产精品多p对白交换绿帽| 精品无码老熟妇magnet| 精品亚洲精品日韩精品| 九九九国产| 亚洲欧美日韩高清一区二区三区| 欧美激欧美啪啪片| 亚洲高清成人av在线| 午夜成人精品福利网站在线观看| 久久综合久久美利坚合众国| 国产亚洲精品精品精品| 久久精品一偷一偷国产| 无码av中文字幕久久专区| 亚洲熟女精品一区二区| 国模雨珍浓密毛大尺度150p| 国产喷水1区2区3区咪咪爱AV| 好男人视频www在线观看| 老色批国产在线观看精品| 麻豆人人妻人人妻人人片av| 国产一区二区爽爽爽视频| 国产精品无码a∨麻豆| 国产精品午夜福利视频| 国产精品综合色区在线观| 亚洲人成人网站色www| 久久久久国产精品人妻| 中文毛片无遮挡高潮免费| 深夜免费av在线观看|