目录
- 一、阿里云oss简介
- 1 - 入口
- 2 - 资源术语
- 3 - bucket新建
- 二、代码控制文件上传
- 1 - 官方入门
- 2 - 创建Accesskey
- 3 - RAM管理
- 4 - 测试上传图片
- 三、前端直传oss
- 1 - 传统方式文件保存的弊端
- 2 - 前端直传oss的流程
- 3 - gin集成前端直传
- 4 - 内网穿透
- 四、gin集成oss
- 六、完整源码
一、阿里云oss简介
1 - 入口
- oss入口:控制台 -> 对象存储 oss
- api文档:右下角 -> 常用入口 -> API 文档 -> 文档中心打开
2 - 资源术语
3 - bucket新建
- 其他的配置默认即可:有需要再自行查阅资料
- HDFS服务:未开通
- 同城冗余存储:未开通
- 版本控制:未开通
- 服务端加密:无
- 实时日志查询:未开通
- 定时备份:未开通
二、代码控制文件上传
1 - 官方入门
- 官方快速入门
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() {
// yourEndpoint填写Bucket对应的Endpoint,以华东1(杭州)为例,填写为https://oss-cn-hangzhou.aliyuncs.com。其它Region请按实际情况填写。
endpoint := "yourEndpoint"
// 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
accessKeyId := "yourAccessKeyId"
accessKeySecret := "yourAccessKeySecret"
// yourBucketName填写存储空间名称。
bucketName := "yourBucketName"
// yourObjectName填写Object完整路径,完整路径不包含Bucket名称。
objectName := "yourObjectName"
// yourLocalFileName填写本地文件的完整路径。
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)
}
}
- 查看Endpoint
2 - 创建Accesskey
- Accesskey入口: 控制台 -> 头像
3 - RAM管理
- RAM访问控制入口
- RAM新建用户
4 - 测试上传图片
package main
import (
"fmt"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
"os"
)
func handleError(err error) {
fmt.Println("Error:", err)
os.Exit(-1)
}
func main() {
// Endpoint以杭州为例,其它Region请按实际情况填写。
endpoint := "http://oss-cn-shanghai.aliyuncs.com"
// 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。
accessKeyId := "上一步获取的accessKeyId"
accessKeySecret := "上一步获取的accessKeySecret"
bucketName := "my-jp-oss"
// <yourObjectName>上传文件到OSS时需要指定包含文件后缀在内的完整路径,例如abc/efg/123.jpg。
objectName := "goods/first.jpg"
// <yourLocalFileName>由本地文件路径加文件名包括后缀组成,例如/users/local/myfile.txt。
localFileName := `D:\Downloads\360Downloads\lua.png`
// 创建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
1 - 传统方式文件保存的弊端
2 - 前端直传oss的流程
考虑到安全问题:我们不应该直接将id和secrect保存在前端直传oss
3 - gin集成前端直传
- 步骤1: 下载应用服务器源码(Go版本)到应用服务器的目录下
- 步骤2: 下载客户端源码到PC端的本地目录
- 步骤3: 修改CORS(根据官方的步骤)
- 解压处上述下载的文件到测试工程中
- appserver.go:修改id,secret以及bucketname
- 终端中打开运行
- 浏览器访问:http://127.0.0.1:8082/
- 运行index.html
- 打开upload.js文件:修改serverUrl
if (xmlhttp!=null)
{
// serverUrl是 用户获取 '签名和Policy' 等信息的应用服务器的URL,请将下面的IP和Port配置为您自己的真实信息。
serverUrl = 'http://127.0.0.1:8082'
xmlhttp.open( "GET", serverUrl, false );
xmlhttp.send( null );
return xmlhttp.responseText
}
- 返回到前端页面选择文件上传
- 不适用回调的上传:aliyun-oss-appserver-js-master/upload.js,注释掉callback,刷新后重新访问
new_multipart_params = {
'key' : g_object_name,
'policy': policyBase64,
'OSSAccessKeyId': accessid,
'success_action_status' : '200', //让服务端返回200,不然,默认会返回204
// 'callback' : callbackbody,
'signature': signature,
};
4 - 内网穿透
- 为什么需要内网穿透:续断 -> https://cloud.zhexi.tech/
- aliyun-oss-appserver-js-master/upload.js:需要开启callback
new_multipart_params = {
'key' : g_object_name,
'policy': policyBase64,
'OSSAccessKeyId': accessid,
'success_action_status' : '200', //让服务端返回200,不然,默认会返回204
'callback' : callbackbody,
'signature': signature,
};
四、gin集成oss
以下列出主要的修改,其他可以查看源码
- oss_web/static/js/upload.js:需要根据自己的ip修改serverUrl
- oss_web/utils/oss.go:
var expire_time int64 = 3000
,也可以将这个配置提取到nacos中
- nacos主要配置
{
"name":"oss_web",
"host":"192.168.78.1",
"tags":["mxshop","imooc","bobby","oss","web"],
"port":8029,
"oss":{
"key":"xxxxxxx",
"secrect":"xxxxx",
"host":"my-jp-oss.oss-cn-shanghai.aliyuncs.com",
"callback_url":"sadaxxxxxxx",
"upload_dir":"mxshop_images"
},
"jwt":{
"key":"VYLDYq3&hGWjWqF$K1ih"
},
"consul":{
"host":"192.168.78.31",
"port": 8500
}
}
六、完整源码
- 完整源码下载:mxshop_srvsV8.5.rar
- 源码说明:(nacos的ip配置自行修改,全局变量DEV_CONFIG设置:1=zsz,2=comp,3=home)
- goods_srv/model/sql/mxshop_goods.sql:包含了建表语句
- other_import/api.json:YApi的导入文件
- other_import/nacos_config_export_user.zip:nacos的user配置集导入文件
- other_import/nacos_config_export_goods.zip:nacos的goods配置集导入文件