文件上传


GoAdmin默认提供一个本地文件上传引擎,支持将文件上传到服务器。使用需要在全局配置中设置上传的目录,以及上传文件访问的前缀。

package config

// 存储目录:存储头像等上传文件
type Store struct {
    Path   string // 相对或绝对路径,文件会存储到这里
    Prefix string // 访问前缀
}

type Config struct {

    ...

    // 上传文件存储的位置
    Store Store `json:"store"`

    // 文件上传引擎
    FileUploadEngine FileUploadEngine `json:"file_upload_engine"`

    ...
}

type FileUploadEngine struct {
    Name   string
    Config map[string]interface{}
}

// UploadFun is a function to process the uploading logic.
type UploadFun func(*multipart.FileHeader, string) (string, error)

如果你想要自定义上传位置,比如上传到又拍云,七牛云等云平台,那么你需要自己写一个上传引擎。下面介绍如何自己写引擎:

引擎的类型

package file

// 上传引擎
type Uploader interface {
    Upload(*multipart.Form) error
}

// 上传引擎生成函数
type UploaderGenerator func() Uploader

// 增加引擎接口api
func AddUploader(name string, up UploaderGenerator) {
    ...
}

调用

我们需要调用AddUploader方法来增加一个上传引擎,第一个参数是引擎的名字(将在全局配置中用到),第二参数就是引擎生成函数。

假设我们要增加一个七牛云上传引擎,那么可以类似这样:

package main

import (
    ...
    "github.com/GoAdminGroup/go-admin/modules/file"
    ...
)

type QiNiuUploader struct {
    Bucket    string
    Region    string
    SecretId  string
    SecretKey string

    Prefix string
    Path   string
}

func (q QiNiuUploader) Upload(form *multipart.Form) error {
    // 接收一个表单类型,这里实现上传逻辑
    // 这里调用框架的辅助函数
    file.Upload(func(*multipart.FileHeader, string) (string, error){
        // 这里实现上传逻辑,返回文件路径与错误信息
    }, form)    
}

func main() {

    ...

    file.AddUploader("qiniu", func() file.Uploader {
        return &QiNiuUploader{
            Bucket:     config.Get().FileUploadEngine.Config["bucket"].(string),
            Region:     config.Get().FileUploadEngine.Config["region"].(string),
            SecretId:   config.Get().FileUploadEngine.Config["secret_id"].(string),
            SecretKey:  config.Get().FileUploadEngine.Config["secret_key"].(string),
            Prefix:     config.Get().FileUploadEngine.Config["prefix"].(string),
            Path:       config.Get().FileUploadEngine.Config["path"].(string),
        }
    })

    cfg := config.Config{
        ...

        FileUploadEngine: config.FileUploadEngine{
            Name: "qiniu",
            Config: map[string]interface{}{
                "bucket": "xxx",
                "region": "xxx",
                "secret_id": "xxx",
                "secret_key": "xxx",
                "prefix": "xxx",
                "path": "xxx",
            },
        }

        ...
    }

    ...
}

这样就实现一个七牛云上传文件引擎了!🍺🍺