gopic 是一个图床工具,用来上传到七牛云或者github 等,使用简单,容易开发插件,全并发,充分解耦
gopic命令 | 说明 |
---|---|
init | 初始化配置,配置生成在home/.gopic.json |
conf | 打印配置信息等 |
update | 从github更新自己 |
run | 图床主命令,下表有详细参数介绍 |
gopic run 参数 | 说明 | 默认值 |
---|---|---|
-a,--all | bool类型,若为true,将上传到配置中激活的所有存储插件中 | false,若为false,-s内容为空会报错 |
-o, --out | string类型,选用哪一个存储插件作为返回值 | 默认为第一个存储 |
-s,--storage | string列表,选择要上传到哪些存储插件中,用, 分割 |
默认为空,若为空,-a未配置会报错 |
-p,path | string列表,图片可以是本地地址,也可以是网络地址 | 必选值 |
例如gopic upload -a -p ./1.gif ./2.png https://baidu.com/img.png -o qiniu
代表上传./1.gif ./2.png https://baidu.com/img.png
三个图片到所有已经激活的插件,并使用qiniu
插件的返回值
结果为:
https://pic.longtao.fun/pics/22/8520716594215125117496217642356398137175_1.png https://pic.longtao.fun/pics/22/230182152169544190214107228101001761655235_2.png https://pic.longtao.fun/pics/22/254555454555441902154101556543454354543545_img.png
其中22为年份,文件名为图片内容的md5结果与原本文件名使用_
连接,能有效去重
进入文件->偏好设置
2. 在偏好配置->图像
选项卡中选择插入图片时上传图片,并使用Custom Command
自定义上传服务,在命令中填写需要的gopic命令即可
- 使用验证图片上传成功后,即可开心的任意粘贴图片,文章中图片会自动保存到激活插件的存储中,本说明的图片就使用gopic自动上出处理
插件需要添加到plugin
目录中,需要满足以下条件
- 定义这个插件的类,其中要包含基础类
*utils.BaseStorage
; - 实现
Upload(im *utils.Image)(string,error)
方法,在Upload
中实现单个图片的上传,返回值分别为:图片返回地址、错误信息; - 定义初始化函数
init()
- 将插件名和帮助文档写入
utils.StroageHelp
- 将插件名和实例写入
utils.StroageMap
,注意需要判断是否active
例子:
package plugin
import (
"bytes"
"encoding/json"
"gopic/conf"
"gopic/utils"
"io/ioutil"
"net/http"
)
//定义插件类
type GithubStorage struct {
B *utils.BaseStorage
}
//定义插件名
const (
githubPluginName = "github"
)
//声明插件配置
var githubConfig map[string]interface{}
//实现Upload方法
func (g *GithubStorage) Upload(im *utils.Image) (string, error) {
responseURL := githubConfig["responseurl"].(string)
requestURL := githubConfig["requesturl"].(string)
token := githubConfig["token"].(string)
return responseURL + im.OutSuffix, uploadPictureToGithub(requestURL, token, im.OutBase64, im.OutSuffix)
}
//实现插件实例构造函数
func NewGithubStorage() *GithubStorage {
return &GithubStorage{utils.NewBaseStorage()}
}
//upload具体的实现,用来上传单个图片
func uploadPictureToGithub(requestURL, token, data, suffix string) error {
url := requestURL + suffix
body := make(map[string]interface{})
body["branch"] = "main"
body["message"] = "markdown upload picture"
body["content"] = data
jsonBody, _ := json.Marshal(body)
req, _ := http.NewRequest("PUT", url, bytes.NewBuffer(jsonBody))
req.Header.Set("Content-Type", "application/json")
req.Header.Set("Authorization", "token "+token)
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
return err
}
defer resp.Body.Close()
_, err = ioutil.ReadAll(resp.Body)
return err
}
//初始化函数
func init() {
//将帮助文档写入
utils.StroageHelp[githubPluginName] = githubHelp()
//读取插件配置
githubConfig = conf.Viper.GetStringMap(githubPluginName)
//判断插件是否在配置文件中存在
if githubConfig == nil {
return
}
//判断配置中的插件是否处于激活状态
active := githubConfig["active"]
if active == nil {
return
}
//如果插件处于激活状态,将插件的实例传入utils.StroageMap
if active == true {
utils.StroageMap[githubPluginName] = NewGithubStorage()
}
}
//帮助文档具体实现
func githubHelp() string {
return "github plugin need this parameters:\nactive: false or true\nresponseURL: like https://gcore.jsdelivr.net/gh/yourUserName/pics@main/\nrequestURL: like https://api.github.com/repos/yourUserName/pics/contents/\ntoke: your github token"
}
不同图片之间以及不同插件之间全部并行
使用一个插件传输一张图片
的时间T11与使用n个插件传输n张图片
的时间Tnn, 在算力满足的条件下,Tnn远远小于T11*n
,更远远小于T11*n*n
插件与框架完全解耦,可自行编写插件