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');
本地 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) } }