Gin阿里云文件上传

阿里云官方文档:https://help.aliyun.com/document_detail/32145.html
先贴代码

package upload

import (
    "bytes"
    "crypto/md5"
    "fmt"
    "github.com/gin-gonic/gin"
    "path"
    "strings"
    "time"

    aliyunOss "github.com/aliyun/aliyun-oss-go-sdk/oss"
)

// form表单上传文件
func UploadFileByForm(c *gin.Context) (string, error) {
    // 重点开始了
    // Endpoint以杭州为例,其它Region请按实际情况填写。
    endpoint := "http://oss-cn-hangzhou.aliyuncs.com"
    // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
    accessKeyId := ""
    accessKeySecret := ""
    bucketName := ""
    // 1.对form表单传过来的文件进行读取
    file, errF := c.FormFile("img_file")
    fileHandle, err := file.Open()
    if err != nil {
        return "", err
    }
    defer fileHandle.Close()
    // file中没有单独列出扩展名,所以此处需要单独取一次
    fileExt := path.Ext(file.Filename)
    // 此处重命名文件名 取此时的时间错的MD5为上传OSS的文件名
    data := []byte(time.Now().String())
    md5FileName := fmt.Sprintf("%x", md5.Sum(data))
    // 以年月为文件目录进行分类
    tTime := time.Now().Format("200601")
    // 年月/文件名.扩展名(注意不要再定义的目录前面加/)
    ossFilePath := fmt.Sprintf("%s/%s%s", tTime, md5FileName, fileExt)

    client, err := aliyunOss.New(endpoint, accessKeyId, accessKeySecret)
    if err != nil {
        return "", err

    }

    bucket, err := client.Bucket(bucketName)
    if err != nil {
        return "", err

    }
    err = bucket.PutObject(ossFilePath, fileHandle)
    if err != nil {
        return "", err
    }

    fileRes := fmt.Sprintf("https://%s.%s/%s", bucketName, endpoint, ossFilePath)

    return fileRes, nil
}

// 通过byte数组上传文件
func UploadFileByByte(c *gin.Context) (string, error) {
    // Endpoint以杭州为例,其它Region请按实际情况填写。
    endpoint := "http://oss-cn-hangzhou.aliyuncs.com"
    // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
    accessKeyId := ""
    accessKeySecret := ""
    bucketName := ""

    file, err := c.FormFile("img_file")
    if err != nil {
        return "", err
    }
    // 这里已经是一个byte的形式了
    fileHandle, err := file.Open() //打开上传文件
    if err != nil {
        return "", err
    }
    defer fileHandle.Close()

    // file中没有单独列出扩展名,所以此处需要单独取一次
    fileExt := path.Ext(file.Filename)
    // 此处重命名文件名 取此时的时间错的MD5为上传OSS的文件名
    data := []byte(time.Now().String())
    md5FileName := fmt.Sprintf("%x", md5.Sum(data))
    // 以年月为文件目录进行分类
    tTime := time.Now().Format("200601")
    // 年月/文件名.扩展名(注意不要再定义的目录前面加/)
    ossFilePath := fmt.Sprintf("%s/%s%s", tTime, md5FileName, fileExt)

    client, err := aliyunOss.New(endpoint, accessKeyId, accessKeySecret)
    if err != nil {
        return "", err

    }

    bucket, err := client.Bucket(bucketName)
    if err != nil {
        return "", err

    }
    err := bucket.PutObject(ossFilePath, bytes.NewReader(fileByte))
    if err != nil {
        return "", err
    }

    fileRes := fmt.Sprintf("https://%s.%s/%s", bucketName, endpoint, ossFilePath)

    return fileRes, nil
}

你可能感兴趣的:(Gin阿里云文件上传)