mirror of
https://github.com/eiblog/eiblog.git
synced 2026-02-04 13:52:26 +08:00
115 lines
2.5 KiB
Go
115 lines
2.5 KiB
Go
package main
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"io"
|
|
"path/filepath"
|
|
|
|
"github.com/eiblog/eiblog/setting"
|
|
"qiniupkg.com/api.v7/kodo"
|
|
"qiniupkg.com/api.v7/kodocli"
|
|
url "qiniupkg.com/x/url.v7"
|
|
)
|
|
|
|
var qiniu_cfg = &kodo.Config{
|
|
AccessKey: setting.Conf.Kodo.AccessKey,
|
|
SecretKey: setting.Conf.Kodo.SecretKey,
|
|
Scheme: "https",
|
|
}
|
|
|
|
type bucket struct {
|
|
name string
|
|
domain string
|
|
accessKey string
|
|
secretKey string
|
|
}
|
|
|
|
type PutRet struct {
|
|
Hash string `json:"hash"`
|
|
Key string `json:"key"`
|
|
}
|
|
|
|
func onProgress(fsize, uploaded int64) {
|
|
d := int(float64(uploaded) / float64(fsize) * 100)
|
|
if fsize == uploaded {
|
|
fmt.Printf("\rUpload completed! ")
|
|
} else {
|
|
fmt.Printf("\r%02d%% uploaded ", int(d))
|
|
}
|
|
}
|
|
|
|
func FileUpload(name string, size int64, data io.Reader) (string, error) {
|
|
if setting.Conf.Kodo.AccessKey == "" || setting.Conf.Kodo.SecretKey == "" {
|
|
return "", errors.New("qiniu config error")
|
|
}
|
|
|
|
// 创建一个client
|
|
c := kodo.New(0, qiniu_cfg)
|
|
|
|
// 设置上传的策略
|
|
policy := &kodo.PutPolicy{
|
|
Scope: setting.Conf.Kodo.Name,
|
|
Expires: 3600,
|
|
InsertOnly: 1,
|
|
}
|
|
|
|
// 生成一个上传token
|
|
token := c.MakeUptoken(policy)
|
|
// 构建一个uploader
|
|
zone := 0
|
|
uploader := kodocli.NewUploader(zone, nil)
|
|
|
|
key := getKey(name)
|
|
if key == "" {
|
|
return "", errors.New("不支持的文件类型")
|
|
}
|
|
|
|
var ret PutRet
|
|
var extra = kodocli.PutExtra{OnProgress: onProgress}
|
|
err := uploader.Put(nil, &ret, token, key, data, size, &extra)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
url := "https://" + setting.Conf.Kodo.Domain + "/" + url.Escape(key)
|
|
return url, nil
|
|
}
|
|
|
|
func FileDelete(name string) error {
|
|
// new一个Bucket管理对象
|
|
c := kodo.New(0, qiniu_cfg)
|
|
p := c.Bucket(setting.Conf.Kodo.Name)
|
|
|
|
key := getKey(name)
|
|
if key == "" {
|
|
return errors.New("不支持的文件类型")
|
|
}
|
|
|
|
// 调用Delete方法删除文件
|
|
err := p.Delete(nil, key)
|
|
// 打印返回值以及出错信息
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func getKey(name string) string {
|
|
ext := filepath.Ext(name)
|
|
var key string
|
|
switch ext {
|
|
case ".bmp", ".png", ".jpg", ".gif", ".ico":
|
|
key = "blog/img/" + name
|
|
case ".mov", ".mp4":
|
|
key = "blog/video/" + name
|
|
case ".go", ".js", ".css", ".cpp", ".php", ".rb", ".java", ".py", ".sql", ".lua", ".html", ".sh", ".xml", ".cs":
|
|
key = "blog/code/" + name
|
|
case ".txt", ".md", ".ini", ".yaml", ".yml", ".doc", ".ppt", ".pdf":
|
|
key = "blog/document/" + name
|
|
case ".zip", ".rar", ".tar", ".gz":
|
|
key = "blog/archive/" + name
|
|
}
|
|
return key
|
|
}
|