本文主要在Go语言基础上实现阿里云OSS存储

一、阿里云存储库配置

1.打开阿里云登录 - 欢迎登录阿里云,安全稳定的云计算服务平台  阿里云官网登录

2.登录后点击首页左侧 对象存储oss 

3.新建Bucket

填写Bucket名称即可 目前无法修改公共访问权限 可以新建之后再修改权限

4.获取Bucket信息以及Access密钥

刚才的Bucket创建好之后点击名称即可跳转至以下界面,点击概览 获取详细信息  

继续往下翻可以获取到Endpoint地域节点信息

最后页面右上角个人中心查看AccessKey信息

二、Go项目配置

1. oss配置  这里的信息就是我们上一步获取到的信息

oss:
  accessKeyId: xxxxx
  accessKeySecret: xxxxx
  bucketName:xxxx
  endpoint: xxxxx

2.代码

package controllers

import (
	"github.com/aliyun/aliyun-oss-go-sdk/oss"
	_ "github.com/aliyun/aliyun-oss-go-sdk/oss"
	"github.com/gin-gonic/gin"
	"github.com/google/uuid"
	"log"
	"net/http"
	"path/filepath"
	"pet_server/config"
	"time"
)

func UploadFile(c *gin.Context) {
	// 1. 获取上传文件
	file, err := c.FormFile("file")
	if err != nil {
		c.JSON(http.StatusBadRequest, gin.H{"error": "文件获取失败"})
		return
	}

	// 2. 打开文件
	src, err := file.Open()
	if err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{"error": "文件打开失败"})
		return
	}
	defer src.Close()

	// 3. 生成唯一文件名
	ext := filepath.Ext(file.Filename)
	filename := generateFileName(ext)

	// 4. 初始化OSS客户端并获取Bucket
	client, err := oss.New(config.AppConfig.Oss.Endpoint, config.AppConfig.Oss.AccessKeyId, config.AppConfig.Oss.AccessKeySecret)
	if err != nil {
		log.Printf("OSS客户端初始化失败: %v", err)
		c.JSON(http.StatusInternalServerError, gin.H{"error": "服务不可用"})
		return
	}
	bucketName := config.AppConfig.Oss.BucketName
	bucket, err := client.Bucket(bucketName)
	if err != nil {
		log.Printf("获取Bucket失败: %v", err)
		c.JSON(http.StatusInternalServerError, gin.H{"error": "服务不可用"})
		return
	}

	// 5. 上传文件到OSS
	err = bucket.PutObject(filename, src)
	if err != nil {
		log.Printf("OSS上传失败: %v", err)
		c.JSON(http.StatusInternalServerError, gin.H{"error": "文件上传失败"})
		return
	}

	// 6. 返回访问URL
	url := "https://" + bucketName + "." + config.AppConfig.Oss.Endpoint + "/" + filename
	c.JSON(http.StatusOK, gin.H{
		"code": 200,
		"data": gin.H{
			"url":  url,
			"size": file.Size,
			"name": filename,
		},
	})
}

// 生成唯一文件名
func generateFileName(ext string) string {
	return time.Now().Format("PetFosterCare") + "-" + uuid.New().String() + ext
}

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐