使用Golang上传文件到MinIO对象存储(一)

2,032 阅读3分钟

这是我参与8月更文挑战的第13天,活动详情查看:8月更文挑战

前言

前一篇文章介绍了开源存储系统 MinIO 的基本内容,今天我们就来看一下,如何使用 Golang 语言将本地的文件上传到 MinIO 对象存储服务上。

集成SDK

步骤一

首先,导入 minio-go sdk 包,这是我们上传 MinIO 对象存储的前提,其实,我们可以多种语言实现上传功能,今天仅以 Golang 为例进行说明。

导入sdk包:

import "github.com/minio/minio-go/v6"

步骤二

创建 MinIO 服务的配置参数,包括服务地址、服务ID、服务Key、服务协议类型。其中,服务地址可以是域名,也可以是IP+端口;服务协议类型可以是http,或者是https,意思是上传资源后,生成可访问地址的协议类型。

 endpoint := "172.31.102.222:9000"
 accessKeyID := "admin"
 secretAccessKey := "test123"
 useSSL := true

步骤三

创建 MinIO 客户端对象,所需要的参数信息就是第二步中的配置参数内容。代码如下:

    minioClient, err := minio.New(endpoint, accessKeyID, secretAccessKey, useSSL)
    if err != nil {
        log.Fatalln("创建 MinIO 客户端失败", err)
        return
    }
    log.Printf("创建 MinIO 客户端成功")

步骤四

创建存储桶,最后在创建时,先校验目标存储桶是否已经存在,如果已经存在则不需要再进行创建,具体代码如下:

    // 创建一个叫 mybucket 的存储桶。
    bucketName := "mybucket"
    location := "beijing"

    err = minioClient.MakeBucket(bucketName, location)
    if err != nil {
        // 检查存储桶是否已经存在。
        exists, err := minioClient.BucketExists(bucketName)
        if err == nil && exists {
            log.Printf("存储桶 %s 已经存在", bucketName)
        } else {
            log.Fatalln("查询存储桶状态异常", err)
        }
    }
    log.Printf("创建存储桶 %s 成功", bucketName)

步骤五

指定上传文件、存储路径、文件类型,调用 minio-go 上传接口 FPutObject,进行上传操作。具体代码如下:

    // 指定上传文件为 test.txt
    objectName := "test.txt"
    // 指定上传文件路径
    filePath := "/test/test.txt"
    // 指定上传文件类型
    contentType := "application/zip"

    // 调用 FPutObject 接口上传文件。
    n, err := minioClient.FPutObject(bucketName, objectName, filePath, minio.PutObjectOptions{ContentType:contentType})
    if err != nil {
        log.Fatalln("上传文件失败", err)
    }

    log.Printf("上传文件 %s 成功\n", objectName)

好了,到这里,上传代码就都编写完了。

测试验证毫无压力。

异常处理

如果在执行过程中遇到了如下报错信息,可以将服务协议类型设置成 false,也就是 useSSL = false,问题解决。其实,根本原因是服务器 MinIO 的服务协议类型和客户端使用的协议类型不一致造成的。如果服务器支持 https,那么客户端可以将 useSSL 置成 true。

报错信息:

Get "https://172.31.102.222:9000/mybucket/?location=beijing": http: server gave HTTP response to HTTPS client

日历打卡(8月更文挑战)

image.png

番外篇

今日吐槽

今天不得不吐槽一下掘金,昨天晚上发的文章,今天上午发现了语句问题,然后手欠重新编辑了,居然不通过了。。。询问结果居然是涉嫌系统推广。天啊!如果文章有问题,那么昨天晚上能不能就别给过了,今天改个错别字,就又涉嫌系统推广了?也真是为难帮我说话的小姐姐了。啥品控呀?多影响我八月更文打卡的积极性啊。。。是不是差了一天?全勤没戏了。。。