增加Minio上传引擎
Minio是一种高性能对象存储。它与Amazon S3云存储服务兼容。
GoAdmin默认提供一个本地文件上传引擎,支持将文件上传到服务器。使用需要在全局配置中设置上传的目录,以及上传文件访问的前缀。
参考:文件上传
分为以下几步:
- 定义Minio结构
// MinioUploader minio上传
type MinioUploader struct {
Bucket string `json:"bucket"` // 桶
Region string `json:"region"` // 区域
SecretID string `json:"secret_id"` // ID
SecretKey string `json:"secret_key"` // 密钥
UseSSL bool `json:"usessl"` // 是否使用ssl
Prefix string `json:"prefix"` // 前缀,例如文件夹,格式为biz/
Path string `json:"path"` // 对应minio endpoint
}
- 实现Uploader接口
func (u *MinioUploader) Upload(form *multipart.Form) error {
file.Upload(func(fileObj *multipart.FileHeader, filename string) (string, error) {
// 实现上传逻辑,返回文件路径与错误信息
minioClient, err := minio.New(u.Path, &minio.Options{
Creds: credentials.NewStaticV4(u.SecretID, u.SecretKey, ""),
Secure: u.UseSSL,
})
if err != nil {
// 如果minioClient创建失败,返回
return "", err
}
// minio存储中的对象名称
objectName := filename
if u.Prefix != "" {
objectName = u.Prefix + filename
}
// 获取上传的文件句柄
f, err := fileObj.Open()
if err != nil {
// 打开上传文件句柄失败,返回
return "", err
}
// 调用Minio Sdk的对象上传
info, err := minioClient.PutObject(context.Background(), u.Bucket, objectName, f, fileObj.Size, minio.PutObjectOptions{})
if err != nil {
// 对象上传失败,返回
return "", err
}
return info.Key, nil
}, form)
return nil
}
- 在main.go中进行调用
// 在engine中添加配置
file.AddUploader("minio", func() file.Uploader {
return &tools.MinioUploader{
Bucket: config.GetFileUploadEngine().Config["bucket"].(string),
Region: config.GetFileUploadEngine().Config["region"].(string),
SecretID: config.GetFileUploadEngine().Config["secret_id"].(string),
SecretKey: config.GetFileUploadEngine().Config["secret_key"].(string),
UseSSL: config.GetFileUploadEngine().Config["usessl"].(bool),
Prefix: config.GetFileUploadEngine().Config["prefix"].(string),
Path: config.GetFileUploadEngine().Config["path"].(string),
}
})
_ = r.Run(":9033")
- 在Web配置中心(网站设置)添加文件上传引擎参数配置。
这样就实现一个Minio上传文件引擎了!