在实际开发中,文件上传是一个非常常见的需求。本文将介绍如何使用 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. 特点说明
- 自动生成存储路径: 按照日期自动生成文件存储路径,方便管理
- 返回值设计:
- 返回完整的访问URL
- 返回存储路径(用于后续删除)
- 返回错误信息
- 异常处理: 包含了完整的错误处理和日志记录
- 资源释放: 使用 defer 确保文件句柄正确关闭
6. 注意事项
- 请妥善保管 AccessKeyId 和 AccessKeySecret
- 建议对上传文件的大小、类型等进行限制
- 建议在生产环境中使用 HTTPS
- 文件路径中最好包含时间戳或唯一标识,避免文件名冲突
- 根据实际需求配置合适的存储空间权限
总结
通过以上代码实现,我们可以轻松地实现文件上传到阿里云 OSS 的功能。该实现具有良好的扩展性和可维护性,可以根据实际需求进行进一步的定制和优化。
希望这篇文章对你实现阿里云 OSS 文件上传功能有所帮助!