目录

  • 一、阿里云oss简介
  • 1 - 入口
  • 2 - 资源术语
  • 3 - bucket新建
  • 二、代码控制文件上传
  • 1 - 官方入门
  • 2 - 创建Accesskey
  • 3 - RAM管理
  • 4 - 测试上传图片
  • 三、前端直传oss
  • 1 - 传统方式文件保存的弊端
  • 2 - 前端直传oss的流程
  • 3 - gin集成前端直传
  • 4 - 内网穿透
  • 四、gin集成oss
  • 六、完整源码


一、阿里云oss简介

1 - 入口

  • oss入口:控制台 -> 对象存储 oss
  • python 阿里 oss2 创建 client 阿里云oss接口文档_API

  • api文档:右下角 -> 常用入口 -> API 文档 -> 文档中心打开
  • python 阿里 oss2 创建 client 阿里云oss接口文档_微服务_02


  • python 阿里 oss2 创建 client 阿里云oss接口文档_微服务_03

2 - 资源术语

python 阿里 oss2 创建 client 阿里云oss接口文档_golang_04

3 - bucket新建

  • 其他的配置默认即可:有需要再自行查阅资料
  • HDFS服务:未开通
  • 同城冗余存储:未开通
  • 版本控制:未开通
  • 服务端加密:无
  • 实时日志查询:未开通
  • 定时备份:未开通

二、代码控制文件上传

1 - 官方入门

python 阿里 oss2 创建 client 阿里云oss接口文档_架构_05

  • 官方快速入门
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)
	}
}

python 阿里 oss2 创建 client 阿里云oss接口文档_xml_06


三、前端直传oss

1 - 传统方式文件保存的弊端

python 阿里 oss2 创建 client 阿里云oss接口文档_xml_07

2 - 前端直传oss的流程

考虑到安全问题:我们不应该直接将id和secrect保存在前端直传oss

python 阿里 oss2 创建 client 阿里云oss接口文档_xml_08

3 - gin集成前端直传

  • 步骤1: 下载应用服务器源码(Go版本)到应用服务器的目录下
  • 步骤2: 下载客户端源码到PC端的本地目录
  • 步骤3: 修改CORS(根据官方的步骤)

python 阿里 oss2 创建 client 阿里云oss接口文档_xml_09

  • 解压处上述下载的文件到测试工程中
  • 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,
    };

python 阿里 oss2 创建 client 阿里云oss接口文档_架构_10

4 - 内网穿透

  • 为什么需要内网穿透:续断 -> https://cloud.zhexi.tech/
  • python 阿里 oss2 创建 client 阿里云oss接口文档_golang_12

  • 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

python 阿里 oss2 创建 client 阿里云oss接口文档_API_13

  • oss_web/utils/oss.govar expire_time int64 = 3000,也可以将这个配置提取到nacos中

python 阿里 oss2 创建 client 阿里云oss接口文档_API_14

  • 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配置集导入文件