10分钟搞定阿里云 OOS 文件上传 - Go 实战教程

311 阅读2分钟

在实际开发中,文件上传是一个非常常见的需求。本文将介绍如何使用 Go 语言实现阿里云 OSS 的文件上传功能。

1. 前置准备

首先需要安装阿里云 OSS SDK:

go get github.com/aliyun/aliyun-oss-go-sdk/oss

2. 配置结构

需要在配置文件中添加以下阿里云 OSS 配置:

type AliyunOSSConfig struct {
    Endpoint        string // OSS endpoint
    AccessKeyId     string // AccessKeyId
    AccessKeySecret string // AccessKeySecret
    BucketName     string // Bucket名称
    BucketUrl      string // 访问域名
    BasePath       string // 存储根路径
}

3. 核心代码实现

3.1 创建 Bucket 实例

func NewBucket() (*oss.Bucket, error) {
    client, err := oss.New(config.Endpoint, config.AccessKeyId, config.AccessKeySecret)
    if err != nil {
        return nil, err
    }
    
    bucket, err := client.Bucket(config.BucketName)
    if err != nil {
        return nil, err
    }
    
    return bucket, nil
}

3.2 文件上传实现

func (*AliyunOSS) UploadFile(file *multipart.FileHeader) (string, string, error) {
    // 获取 bucket 实例
    bucket, err := NewBucket()
    if err != nil {
        return "", "", err
    }

    // 打开文件
    f, err := file.Open()
    if err != nil {
        return "", "", err
    }
    defer f.Close()

    // 构建文件路径
    filePath := filepath.Join(
        config.BasePath,
        "uploads",
        time.Now().Format("2006-01-02"),
        file.Filename,
    )

    // 上传文件
    err = bucket.PutObject(filePath, f)
    if err != nil {
        return "", "", err
    }

    // 返回访问URL和文件路径
    return config.BucketUrl + "/" + filePath, filePath, nil
}

3.3 文件删除实现

func (*AliyunOSS) DeleteFile(key string) error {
    bucket, err := NewBucket()
    if err != nil {
        return err
    }
    
    return bucket.DeleteObject(key)
}

4. 使用示例

func main() {
    // 初始化上传实例
    ossUploader := &upload.AliyunOSS{}
    
    // 上传文件(假设从HTTP请求中获取文件)
    file, _ := c.FormFile("file")
    url, path, err := ossUploader.UploadFile(file)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("文件上传成功!\n访问URL: %s\n存储路径: %s\n", url, path)
    
    // 删除文件
    err = ossUploader.DeleteFile(path)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println("文件删除成功!")
}

5. 特点说明

  1. 自动生成存储路径: 按照日期自动生成文件存储路径,方便管理
  2. 返回值设计:
    • 返回完整的访问URL
    • 返回存储路径(用于后续删除)
    • 返回错误信息
  3. 异常处理: 包含了完整的错误处理和日志记录
  4. 资源释放: 使用 defer 确保文件句柄正确关闭

6. 注意事项

  1. 请妥善保管 AccessKeyId 和 AccessKeySecret
  2. 建议对上传文件的大小、类型等进行限制
  3. 建议在生产环境中使用 HTTPS
  4. 文件路径中最好包含时间戳或唯一标识,避免文件名冲突
  5. 根据实际需求配置合适的存储空间权限

总结

通过以上代码实现,我们可以轻松地实现文件上传到阿里云 OSS 的功能。该实现具有良好的扩展性和可维护性,可以根据实际需求进行进一步的定制和优化。

希望这篇文章对你实现阿里云 OSS 文件上传功能有所帮助!