当前位置: 首页 > news >正文

gin结合minio来做文件存储

一、使用docker安装

  • 1、安装docker

    sudo apt update
    sudo apt install -y docker.io
    sudo systemctl enable --now docker
    
  • 2、配置自己的阿里云镜像,连接地址

  • 3、拉取镜像

    sudo docker pull minio/minio
    
  • 4、创建容器

    sudo docker run -d \-p 9000:9000 \-p 9001:9001 \-v /mnt/data:/data \-e "MINIO_ROOT_USER=admin" \-e "MINIO_ROOT_PASSWORD=yourpassword" \--name minio \minio/minio server /data --console-address ":9001"
    
    • -p 9000: API 端口(用于客户端访问)。

    • -p 9001: 控制台端口(Web 管理界面)。

    • -v /mnt/data:/data: 将宿主机目录挂载为存储卷(确保 /mnt/data存在)。

    • MINIO_ROOT_USERMINIO_ROOT_PASSWORD: 管理员账号密码。

    • --console-address ":9001": 指定控制台端口。

  • 5、对外开启端口

二、使用源文件安装

  • 1、下载源文件

    wget https://dl.min.io/server/minio/release/linux-amd64/minio
    sudo chmod +x minio
    sudo mv minio /usr/local/bin/
    
  • 2、创建存储目录

    sudo mkdir /mnt/data
    sudo chown -R $USER:$USER /mnt/data
    
  • 3、启动minio服务

    export MINIO_ROOT_USER=admin
    export MINIO_ROOT_PASSWORD=yourpassword
    minio server /mnt/data --console-address ":9001"
    
  • 4、守护进程的方式启动

    nohup minio server /mnt/data --console-address ":9001" > minio.log 2>&1 &
    
  • 5、设置成系统服务(可选)

    [Unit]
    Description=MinIO
    After=network.target[Service]
    User=root
    Environment="MINIO_ROOT_USER=admin"
    Environment="MINIO_ROOT_PASSWORD=yourpassword"
    ExecStart=/usr/local/bin/minio server /mnt/data --console-address ":9001"[Install]
    WantedBy=multi-user.target
    
    • 启用并启动服务

      sudo systemctl enable --now minio
      

三、在gin中集成minio文件存储

  • 1、在minio可视化界面创建一个Buckets用于文件存储

    在这里插入图片描述

  • 2、创建AccessKeyIDSecretAccessKey


在这里插入图片描述

  • 3、安装依赖包

    go get github.com/minio/minio-go/v7
    
  • 4、下面实现上传、下载文件、生成文件地址的方式

    package mainimport ("context""fmt""io""log""net/http""path/filepath""time""github.com/gin-gonic/gin""github.com/minio/minio-go/v7""github.com/minio/minio-go/v7/pkg/credentials"
    )// MinIO 配置
    const (minioEndpoint        = "123.xx.229:9000"                      // 替换为你的 MinIO 地址minioAccessKeyID     = "HZKH0JJxx8NRRASWVT"                     // 替换为你的 Access KeyminioSecretAccessKey = "YASffM8CLzoq6zxgZjDS1N2Av4o" // 替换为你的 Secret KeyminioUseSSL          = falseminioBucketName      = "test1" // 替换为你的 Bucket 名称
    )var minioClient *minio.Clientfunc init() {// 初始化 MinIO 客户端var err errorminioClient, err = minio.New(minioEndpoint, &minio.Options{Creds:  credentials.NewStaticV4(minioAccessKeyID, minioSecretAccessKey, ""),Secure: minioUseSSL,})if err != nil {log.Fatalf("Failed to initialize MinIO client: %v", err)}// 检查并创建存储桶ctx := context.Background()exists, err := minioClient.BucketExists(ctx, minioBucketName)if err != nil {log.Fatalf("Failed to check bucket existence: %v", err)}if !exists {err = minioClient.MakeBucket(ctx, minioBucketName, minio.MakeBucketOptions{})if err != nil {log.Fatalf("Failed to create bucket: %v", err)}log.Printf("Bucket %s created successfully", minioBucketName)}
    }func main() {r := gin.Default()// 上传图片接口r.POST("/upload", uploadImage)// 下载图片接口r.GET("/download/:filename", downloadImage)// 生成30天有效的临时链接objectName := "trailer.mp4"url, err := minioClient.PresignedGetObject(context.Background(), minioBucketName, objectName, 7*24*time.Hour, nil)if err != nil {log.Fatalf("生成链接失败: %v", err)}fmt.Println("地址", url.String())// 启动服务r.Run(":8080")
    }// 上传图片处理函数
    func uploadImage(c *gin.Context) {// 从表单中获取文件file, err := c.FormFile("file")if err != nil {c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})return}// 打开文件fileReader, err := file.Open()if err != nil {c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})return}defer fileReader.Close()// 上传到 MinIOctx := context.Background()objectName := fmt.Sprintf("%d-%s", time.Now().Unix(), file.Filename)contentType := "application/octet-stream"if filepath.Ext(file.Filename) == ".jpg" || filepath.Ext(file.Filename) == ".jpeg" {contentType = "image/jpeg"} else if filepath.Ext(file.Filename) == ".png" {contentType = "image/png"}_, err = minioClient.PutObject(ctx, minioBucketName, objectName, fileReader, file.Size, minio.PutObjectOptions{ContentType: contentType,})if err != nil {c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})return}c.JSON(http.StatusOK, gin.H{"message":    "Image uploaded successfully","objectName": objectName,})
    }// 下载图片处理函数
    func downloadImage(c *gin.Context) {filename := c.Param("filename")// 从 MinIO 获取对象ctx := context.Background()object, err := minioClient.GetObject(ctx, minioBucketName, filename, minio.GetObjectOptions{})if err != nil {c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})return}defer object.Close()// 获取对象信息objInfo, err := object.Stat()if err != nil {c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})return}// 设置响应头c.Header("Content-Disposition", "attachment; filename="+filename)c.Header("Content-Type", objInfo.ContentType)c.Header("Content-Length", fmt.Sprintf("%d", objInfo.Size))// 流式传输文件内容c.Stream(func(w io.Writer) bool {_, err := io.Copy(w, object)if err != nil {return false}return true})
    }
http://www.dtcms.com/a/335544.html

相关文章:

  • The Network Link Layer: 无线传感器中Delay Tolerant Networks – DTNs 延迟容忍网络
  • css: word pacing属性
  • 哈希表与unorder_set,unorder_map的学习
  • Spring 源码学习(十一)—— webmvc 配置
  • 【JavaEE】多线程初阶3:死锁 + 线程安全 + volatile 关键字
  • 已开源:Highcharts.NET,Highcharts Android,与Highcharts iOS集成
  • VS Code配置MinGW64编译Apache Arrow C++库
  • 2025年服装工厂生产管理系统软件推荐
  • 远程桌面管理工具 - 交互式版本
  • 达梦数据库常见的重要巡检语句
  • Qt5 的基础知识
  • 【UEFI系列】ACPI
  • 51单片机-驱动独立按键模块教程
  • 类的静态成员的定义、调用及继承详解【C++每日一学】
  • AI+预测3D新模型百十个定位预测+胆码预测+去和尾2025年8月17日第163弹
  • 深度学习-计算机视觉-数据增广/图像增广
  • 《MATLAB绘图进阶教程》主要内容与专栏目录(持续更新中。。。)
  • GitHub 热榜项目 - 日榜(2025-08-17)
  • 智能体与MCP的核心流程和差异点(适合初学者)
  • IDEA飞算插件测评:重塑AI编码价值的实战体验
  • 【IDEA】设置Debug调试时调试器不进入特定类(Spring框架、Mybatis框架)
  • GEO(生成引擎优化)是什么?GEO优化怎么做
  • 在QML中使用Chart组件
  • Java Stream ForEach算子实现:ForEachOps
  • 半敏捷卫星观测调度系统的设计与实现
  • Git登录配置的详细方法
  • CSS中linear-gradient 的用法
  • Python字符串净化完全指南:专业级字符清理技术与实战
  • 开发者说 | EmbodiedGen:为具身智能打造可交互3D世界生成引擎
  • 区块链练手项目(持续更新)