mirror of
https://github.com/eiblog/eiblog.git
synced 2026-02-04 13:52:26 +08:00
181 lines
3.8 KiB
Go
181 lines
3.8 KiB
Go
// Package internal provides ...
|
|
package internal
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"io"
|
|
"net/http"
|
|
"path/filepath"
|
|
"time"
|
|
|
|
"github.com/eiblog/eiblog/pkg/config"
|
|
|
|
"github.com/qiniu/go-sdk/v7/auth/qbox"
|
|
"github.com/qiniu/go-sdk/v7/storage"
|
|
)
|
|
|
|
// UploadParams upload params
|
|
type UploadParams struct {
|
|
Name string
|
|
Size int64
|
|
Data io.Reader
|
|
NoCompletePath bool
|
|
|
|
Conf config.Qiniu
|
|
}
|
|
|
|
// QiniuUpload 上传文件
|
|
func QiniuUpload(params UploadParams) (string, error) {
|
|
if params.Conf.AccessKey == "" ||
|
|
params.Conf.SecretKey == "" {
|
|
return "", errors.New("qiniu config error")
|
|
}
|
|
key := params.Name
|
|
if !params.NoCompletePath {
|
|
key = filepath.Base(params.Name)
|
|
}
|
|
|
|
mac := qbox.NewMac(params.Conf.AccessKey,
|
|
params.Conf.SecretKey)
|
|
// 设置上传策略
|
|
putPolicy := &storage.PutPolicy{
|
|
Scope: params.Conf.Bucket,
|
|
Expires: 3600,
|
|
InsertOnly: 1,
|
|
}
|
|
// 上传token
|
|
uploadToken := putPolicy.UploadToken(mac)
|
|
// 上传配置
|
|
region, err := storage.GetRegion(params.Conf.AccessKey, params.Conf.Bucket)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
cfg := &storage.Config{
|
|
UseHTTPS: true,
|
|
Region: region,
|
|
}
|
|
// uploader
|
|
uploader := storage.NewFormUploader(cfg)
|
|
ret := new(storage.PutRet)
|
|
putExtra := &storage.PutExtra{}
|
|
|
|
err = uploader.Put(context.Background(), ret, uploadToken,
|
|
key, params.Data, params.Size, putExtra)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
url := "https://" + params.Conf.Domain + "/" + key
|
|
return url, nil
|
|
}
|
|
|
|
// DeleteParams delete params
|
|
type DeleteParams struct {
|
|
Name string
|
|
Days int
|
|
NoCompletePath bool
|
|
|
|
Conf config.Qiniu
|
|
}
|
|
|
|
// QiniuDelete 删除文件
|
|
func QiniuDelete(params DeleteParams) error {
|
|
key := params.Name
|
|
if !params.NoCompletePath {
|
|
key = completeQiniuKey(params.Name)
|
|
}
|
|
|
|
mac := qbox.NewMac(params.Conf.AccessKey,
|
|
params.Conf.SecretKey)
|
|
// 上传配置
|
|
region, err := storage.GetRegion(params.Conf.AccessKey, params.Conf.Bucket)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
cfg := &storage.Config{
|
|
UseHTTPS: true,
|
|
Region: region,
|
|
}
|
|
// manager
|
|
bucketManager := storage.NewBucketManager(mac, cfg)
|
|
// Delete
|
|
if params.Days > 0 {
|
|
return bucketManager.DeleteAfterDays(params.Conf.Bucket, key, params.Days)
|
|
}
|
|
return bucketManager.Delete(params.Conf.Bucket, key)
|
|
}
|
|
|
|
// ContentParams list params
|
|
type ContentParams struct {
|
|
Prefix string
|
|
|
|
Conf config.Qiniu
|
|
}
|
|
|
|
// QiniuContent 获取文件列表
|
|
func QiniuContent(params ContentParams) ([]byte, error) {
|
|
mac := qbox.NewMac(params.Conf.AccessKey,
|
|
params.Conf.SecretKey)
|
|
// region
|
|
region, err := storage.GetRegion(params.Conf.AccessKey, params.Conf.Bucket)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
cfg := &storage.Config{
|
|
UseHTTPS: true,
|
|
Region: region,
|
|
}
|
|
// manager
|
|
bucketManager := storage.NewBucketManager(mac, cfg)
|
|
// list file
|
|
files, _, _, _, err := bucketManager.ListFiles(params.Conf.Bucket, params.Prefix, "", "", 1)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if len(files) == 0 {
|
|
return nil, errors.New("no file")
|
|
}
|
|
deadline := time.Now().Add(time.Second * 60).Unix()
|
|
url := storage.MakePrivateURLv2(mac, "https://"+params.Conf.Domain, files[0].Key, deadline)
|
|
resp, err := http.Get(url)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer resp.Body.Close()
|
|
|
|
return io.ReadAll(resp.Body)
|
|
}
|
|
|
|
// completeQiniuKey 修复路径
|
|
func completeQiniuKey(name string) string {
|
|
ext := filepath.Ext(name)
|
|
|
|
switch ext {
|
|
case ".bmp", ".png", ".jpg",
|
|
".gif", ".ico", ".jpeg":
|
|
|
|
name = "blog/img/" + name
|
|
case ".mov", ".mp4":
|
|
name = "blog/video/" + name
|
|
case ".go", ".js", ".css",
|
|
".cpp", ".php", ".rb",
|
|
".java", ".py", ".sql",
|
|
".lua", ".html", ".sh",
|
|
".xml", ".cs":
|
|
|
|
name = "blog/code/" + name
|
|
case ".txt", ".md", ".ini",
|
|
".yaml", ".yml", ".doc",
|
|
".ppt", ".pdf":
|
|
|
|
name = "blog/document/" + name
|
|
case ".zip", ".rar", ".tar",
|
|
".gz":
|
|
|
|
name = "blog/archive/" + name
|
|
default:
|
|
name = "blog/other/" + name
|
|
}
|
|
return name
|
|
}
|