golang oss表单上传

EasyNetCN · · 622 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

在涉及基于阿里云oss服务的时候,绝大多数情况都是基于表单上传,服务器端生成所需要的信息,这样可以不走本身服务器的流量,灵活并且方便控制。原来基于Java实现的,oss的Java客户端提供了很方便的方法生成policy和signature,golang的客户端貌似没有便捷的方法。以下实现的代码片段仅供参考。

func (s *ossFileService) GetUploadToken(uploadFile model.OssUploadFile) *model.OssUploadToken {
    ossBucket := s.ossBucketRepository.FindById(uploadFile.FileType)

    if ossBucket.Id > 0 {
        fileKey := generateFileKey(uploadFile)

        fileEntity := new(repository.OssFile)

        fileEntity.BucketId = ossBucket.Id
        fileEntity.FileKey = fileKey
        fileEntity.SourceFile = uploadFile.SourceFile
        fileEntity.SourceFileSize = uploadFile.SourceFileSize
        fileEntity.DelStatus = 0

        now := time.Now()

        fileEntity.CreateTime = now
        fileEntity.UpdateTime = now

        result := s.ossFileRepository.Create(*fileEntity)

        bucketType := ossBucket.BucketType
        bucket := ossBucket.Name
        endpoint := ossBucket.Endpoint
        domain := ossBucket.Domain
        accessKeyId := s.ossClient.Config.GetCredentials().GetAccessKeyID()
        secretAccessKey := s.ossClient.Config.CredentialsProvider.GetCredentials().GetAccessKeySecret()
        uploadUrl := fmt.Sprintf("//%s.%s", bucket, endpoint)

        expiration := time.Now().Add(time.Duration(30 * time.Minute)).UTC().Format(time.RFC3339Nano)
        policyStr := fmt.Sprintf(`{"expiration":"%s","conditions":[{"bucket":"%s"},["eq","$key","%s"]]}`, expiration, bucket, fileKey)

        fmt.Println(policyStr)

        policy := base64.StdEncoding.EncodeToString([]byte(policyStr))

        key := []byte(secretAccessKey)
        mac := hmac.New(sha1.New, key)
        mac.Write([]byte(policy))

        signature := base64.StdEncoding.EncodeToString(mac.Sum(nil))

        return &model.OssUploadToken{
            FileId:      result.Id,
            UploadUrl:   uploadUrl,
            AccessKeyId: accessKeyId,
            Policy:      policy,
            Signature:   signature,
            Key:         fileKey,
            Url:         getUrl(bucketType, bucket, endpoint, fileKey, domain)}

    }

    return nil
}

有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:EasyNetCN

查看原文:golang oss表单上传

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

622 次点击  
加入收藏 微博
上一篇:macOS下安装go
下一篇:gRPC SkyLB.md
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传