go 上传文件到阿里云oss

前言

在实训期间,做了一个前后分离的微信小程序:美容院,在首页请求图片的时候,最开始设计的时候是从后端请求拿到图片的集合,而图片的url 表示的是服务器的相对地址,我想的是,将图片上传到阿里云oss,然后将oss链接直接存入图片url,这样在前端页面就可以直接展示。

所需要的数据库表:

CREATE TABLE `image` (
  `id` BIGINT(11) NOT NULL AUTO_INCREMENT COMMENT '图片id',
  `imageurl` VARCHAR(100) DEFAULT NULL COMMENT '图片路径',
  `imagetitle` VARCHAR(50) DEFAULT NULL COMMENT '图片标题',
  `imagetype` VARCHAR(50) DEFAULT NULL COMMENT '图片类型 banner:首页轮播图 nav:菜单 head:头像',
  `imagestate` VARCHAR(10) DEFAULT NULL COMMENT '图片状态  1:可用  0:不可用',
  PRIMARY KEY (`id`)
) ENGINE=INNODB AUTO_INCREMENT=61 DEFAULT CHARSET=utf8;


INSERT INTO `image` VALUES (1, 'banner_01.png', 'banner', 'banner', '1');
INSERT INTO `image` VALUES (2, 'banner_02.png', 'banner', 'banner', '1');
INSERT INTO `image` VALUES (3, 'banner_03.png', 'banner', 'banner', '1');
INSERT INTO `image` VALUES (4, 'banner_04.png', 'banner', 'banner', '1');
INSERT INTO `image` VALUES (5, 'nav_icon_01.png', '推荐', 'nav', '1');
INSERT INTO `image` VALUES (6, 'nav_icon_02.png', '美甲', 'nav', '1');
INSERT INTO `image` VALUES (7, 'nav_icon_03.png', '美容', 'nav', '1');
INSERT INTO `image` VALUES (8, 'nav_icon_04.png', '美发', 'nav', '1');
INSERT INTO `image` VALUES (9, 'nav_icon_05.png', '睫毛', 'nav', '1');
INSERT INTO `image` VALUES (10, 'b1.png', '千峰美容美发商家', 'bus', '1');
INSERT INTO `image` VALUES (11, 'p1.png', '产品', 'pro', '1');
INSERT INTO `image` VALUES (12, 'p2.png', '产品', 'pro', '1');
INSERT INTO `image` VALUES (13, 'p3.png', '产品', 'pro', '1');
INSERT INTO `image` VALUES (14, 'p4.png', '产品', 'pro', '1');
INSERT INTO `image` VALUES (15, 'p5.png', '产品', 'pro', '1');
INSERT INTO `image` VALUES (16, 'p6.png', '产品', 'pro', '1');
INSERT INTO `image` VALUES (17, 'p7.png', '产品', 'pro', '1');
INSERT INTO `image` VALUES (18, 'p8.png', '产品', 'pro', '1');
INSERT INTO `image` VALUES (19, 'p9.png', '产品', 'pro', '1');
INSERT INTO `image` VALUES (20, 'p10.png', '产品', 'pro', '1');
INSERT INTO `image` VALUES (21, 'p11.png', '产品', 'pro', '1');
INSERT INTO `image` VALUES (22, 'p12.png', '产品', 'pro', '1');
INSERT INTO `image` VALUES (23, 'p13.png', '产品', 'pro', '1');
INSERT INTO `image` VALUES (24, 'p14.png', '产品', 'pro', '1');
INSERT INTO `image` VALUES (25, 'p15.png', '产品', 'pro', '1');
INSERT INTO `image` VALUES (26, 'p16.png', '产品', 'pro', '1');
INSERT INTO `image` VALUES (27, 'p17.png', '产品', 'pro', '1');
INSERT INTO `image` VALUES (28, 'p18.png', '产品', 'pro', '1');
INSERT INTO `image` VALUES (29, 'p19.png', '产品', 'pro', '1');
INSERT INTO `image` VALUES (30, 'p20.png', '产品', 'pro', '1');
INSERT INTO `image` VALUES (31, 'p21.png', '产品', 'pro', '1');
INSERT INTO `image` VALUES (32, 'p22.png', '产品', 'pro', '1');
INSERT INTO `image` VALUES (33, 'p23.png', '产品', 'pro', '1');
INSERT INTO `image` VALUES (34, 'p24.png', '产品', 'pro', '1');
INSERT INTO `image` VALUES (35, 'p25.png', '产品', 'pro', '1');
INSERT INTO `image` VALUES (36, 'p26.png', '产品', 'pro', '1');
INSERT INTO `image` VALUES (37, 'p27.png', '产品', 'pro', '1');
INSERT INTO `image` VALUES (38, 'p28.png', '产品', 'pro', '1');
INSERT INTO `image` VALUES (39, 'p29.png', '产品', 'pro', '1');
INSERT INTO `image` VALUES (40, 'p30.png', '产品', 'pro', '1');
INSERT INTO `image` VALUES (41, 'p41.png', '产品', 'pro', '1');
INSERT INTO `image` VALUES (42, 'p42.png', '产品', 'pro', '1');
INSERT INTO `image` VALUES (43, 'p43.png', '产品', 'pro', '1');
INSERT INTO `image` VALUES (44, 'p44.png', '产品', 'pro', '1');
INSERT INTO `image` VALUES (45, 'p45.png', '产品', 'pro', '1');
INSERT INTO `image` VALUES (46, 'p46.png', '产品', 'pro', '1');
INSERT INTO `image` VALUES (47, 'p47.png', '产品', 'pro', '1');
INSERT INTO `image` VALUES (48, 'p48.png', '产品', 'pro', '1');
INSERT INTO `image` VALUES (49, 'p49.png', '产品', 'pro', '1');
INSERT INTO `image` VALUES (50, 'p50.png', '产品', 'pro', '1');
INSERT INTO `image` VALUES (51, 'p51.png', '产品', 'pro', '1');
INSERT INTO `image` VALUES (52, 'p52.png', '产品', 'pro', '1');
INSERT INTO `image` VALUES (53, 'p53.png', '产品', 'pro', '1');
INSERT INTO `image` VALUES (54, 'p54.png', '产品', 'pro', '1');
INSERT INTO `image` VALUES (55, 'p55.png', '产品', 'pro', '1');
INSERT INTO `image` VALUES (56, 'p56.png', '产品', 'pro', '1');
INSERT INTO `image` VALUES (57, 'p57.png', '产品', 'pro', '1');
INSERT INTO `image` VALUES (58, 'p58.png', '产品', 'pro', '1');
INSERT INTO `image` VALUES (59, 'p59.png', '产品', 'pro', '1');
INSERT INTO `image` VALUES (60, 'p60.png', '产品', 'pro', '1');

image-20220506195408376

本地 img 文件压缩包

链接: https://pan.baidu.com/s/1xxGk6gxmAiC3nQTgO_s2VQ?pwd=gsnp 提取码: gsnp 复制这段内容后打开百度网盘手机App,操作更方便哦

实施

安装 SDK

go get github.com/aliyun/aliyun-oss-go-sdk/oss		# oss 依赖
go get -u gorm.io/gorm
go get -u gorm.io/driver/sqlite		# 刚学,这个是干嘛的不知道
go get -u github.com/go-sql-driver/mysql	 # mysql 依赖

复制模版

去阿里云oss 帮助文档 copy 一个demo

package main
import (
  "fmt"
  "os"
  "github.com/aliyun/aliyun-oss-go-sdk/oss"
)
func handleError(err error) {
  fmt.Println("Error:", err)
  os.Exit(-1)
}
func main() {
  // Endpoint以杭州为例,其它Region请按实际情况填写。
  endpoint := "http://oss-cn-hangzhou.aliyuncs.com"
  // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
  accessKeyId := "<yourAccessKeyId>"
  accessKeySecret := "<yourAccessKeySecret>"
  bucketName := "<yourBucketName>"
  // <yourObjectName>上传文件到OSS时需要指定包含文件后缀在内的完整路径,例如abc/efg/123.jpg。
  objectName := "<yourObjectName>"
  // <yourLocalFileName>由本地文件路径加文件名包括后缀组成,例如/users/local/myfile.txt。
  localFileName := "<yourLocalFileName>"
  // 创建OSSClient实例。
  client, err := oss.New(endpoint, accessKeyId, accessKeySecret)
  if err != nil {
    handleError(err)
  }
  // 获取存储空间。
  bucket, err := client.Bucket(bucketName)
  if err != nil {
    handleError(err)
  }
  // 上传文件。
  err = bucket.PutObjectFromFile(objectName, localFileName)
  if err != nil {
    handleError(err)
  }
}

思路

  • 先填好自己oss 的配置
  • 从本地文件读取img 文件夹下面所有的文件
  • 遍历文件,上传文件到oss, 路径为 currentDate/go/fileName
  • 更新数据库,将 imageurl 为文件名的记录的 imageurl字段改为 oss 提供的路径

编码

  • 初始化 database

    func Init() *gorm.DB {
      // 参考 https://github.com/go-sql-driver/mysql#dsn-data-source-name 获取详情
      dsn := "root:paswd@tcp(localhost:3306)/shixun_mr?charset=utf8mb4&parseTime=True&loc=Local"
      db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
        Logger: logger.Default.LogMode(logger.Info),
      })
      if err != nil {
        fmt.Printf("err.Error(): %v \n", err.Error())
      }
      return db
    }
    
  • main 方法

    package main
    
    import (
      "fmt"
      "github.com/aliyun/aliyun-oss-go-sdk/oss"
      "gorm.io/gorm"
      "io/ioutil"
      "os"
      "oss/databases"
      "time"
    )
    
    type Image struct {
      Id                                          int
      Imageurl, Imagetitle, Imagetype, Imagestate string
    }
    
    func handleError(err error) {
      fmt.Println("Error:", err)
      os.Exit(-1)
    }
    
    var DB *gorm.DB
    
    func main() {
      // Endpoint以杭州为例,其它Region请按实际情况填写。
      endpoint := "http://oss-cn-hangzhou.aliyuncs.com"
      // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
      accessKeyId := "<yourAccessKeyId>"
      accessKeySecret := "<yourAccessKeySecret>"
      bucketName := "<yourBucketName>"
      // <yourObjectName>上传文件到OSS时需要指定包含文件后缀在内的完整路径,例如abc/efg/123.jpg。
      //objectName := time.Now().Format("2006-01-02") + "/go/banner_01.png"
      var objectName string
    
    
      // 创建OSSClient实例。
      client, err := oss.New(endpoint, accessKeyId, accessKeySecret)
      if err != nil {
        handleError(err)
      }
      // 获取存储空间。
      bucket, err := client.Bucket(bucketName)
      if err != nil {
        handleError(err)
      }
      // 上传文件。
      DB = databases.Init()
      files, _ := ioutil.ReadDir("/Users/jalivv/Downloads/实训/微信笔记/img")
      for _, f := range files {
        objectName = time.Now().Format("2006-01-02") + "/go/" + f.Name()
        // <yourLocalFileName>由本地文件路径加文件名包括后缀组成,例如/users/local/myfile.txt。
        localFileName := "/Users/jalivv/Downloads/实训/微信笔记/img/" + objectName
        // 上传到oss 阿里云
        err = bucket.PutObjectFromFile(objectName, localFileName)
        if err != nil {
          handleError(err)
        }
    
        // 更改数据库
        //   https://meirong-jalivv.oss-cn-shanghai.aliyuncs.com/
    
        // 官网 copy :
        //db.Model(&user).Update("name", "hello")
        // UPDATE users SET name='hello', updated_at='2013-11-17 21:34:10' WHERE imageurl=??;
        urlPrefix := "https://<yourBucketName>.oss-cn-shanghai.aliyuncs.com/"
        img := Image{Imageurl: f.Name()}
        DB.Debug().Table("image").Model(&img).Where("imageurl=?", f.Name()).Update("imageurl", urlPrefix+objectName)
      }
    
    }
    
    

效果

image-20220506203220021

image-20220506203254767

posted @ 2022-05-06 20:36  jalivv  阅读(436)  评论(0编辑  收藏  举报