深色模式
Typora 一键图片上传
前言
开发一个上传图片的命令行程序,功能是上传图片,返回url。
此命令行程序可以供 Typora 调用,也就是在编写markdown时,粘贴本地图片到markdown中,自动变成图片的url(当然也能实时预览)。
此程序也可以单独使用,获取图片的url。
准备资源
- 先了解一下Typora使用技巧之插入图片及图片上传。
- 开通对象存储服务,配置好存储空间。我这里使用的是七牛。
- 编写一个命令行程序。程序的输入是本地图片路径,可以是多图,输出是上传以后的远程地址。这里使用Go语言编写。
- 域名备案,配置CNAME,并且在存储服务端(这里是七牛)配置自定义域名。这一步略。
Go程序
Go程序非常简单,就一个main.go
,约100行代码:
go
package main
import (
"context"
"encoding/base64"
"errors"
"flag"
"fmt"
"log"
"math/rand"
"path"
"strconv"
"time"
"github.com/qiniu/go-sdk/v7/auth/qbox"
"github.com/qiniu/go-sdk/v7/storage"
)
var (
accessKey = "some-access-key"
secretKey = "some-secret-key"
bucket = "some-name"
customHost = "https://xxx.xxx.xxx" // 七牛图片域名,可以是自定义域名
)
// 接收1个或多个本地图片文件
// 上传到七牛kodo
// 并且对远程文件重命名为随机字符串
func main() {
files, err := readCMD()
if err != nil {
log.Fatal(err)
}
typoraRet := "Upload Success:\n"
for _, file := range files {
key, err := uploadDirectly(file)
if err != nil {
log.Fatal(err)
return
}
typoraRet += customHost
typoraRet += key
typoraRet += "\n"
}
// 将结果写到标准输出,供 Typora 读取
// Typora 会读取最后 n 行作为图片 url,n 是上传的文件数
fmt.Print(typoraRet)
}
// 读取命令行参数,返回所有文件路径
func readCMD() ([]string, error) {
// 读取命令行参数
flag.Parse()
files := flag.Args()
if len(files) == 0 {
return nil, errors.New("file path needed")
}
return files, nil
}
// 服务端直传方式
func uploadDirectly(localFile string) (string, error) {
putPolicy := storage.PutPolicy{
Scope: bucket,
}
mac := qbox.NewMac(accessKey, secretKey)
upToken := putPolicy.UploadToken(mac)
cfg := storage.Config{}
// 空间对应的机房
cfg.Zone = &storage.ZoneHuanan
// 是否使用https域名
cfg.UseHTTPS = false
// 上传是否使用CDN上传加速
cfg.UseCdnDomains = false
// 构建表单上传的对象
formUploader := storage.NewFormUploader(&cfg)
ret := storage.PutRet{}
// 可选配置
putExtra := storage.PutExtra{
Params: map[string]string{
// "x:name": "github logo",
},
}
// 保存的名称
key := remoteKey(localFile)
err := formUploader.PutFile(context.Background(), &ret, upToken, key, localFile, &putExtra)
if err != nil {
return "", fmt.Errorf("七牛 error:%s", err)
}
return ret.Key, nil
}
// 根据本地文件路径,生成随机的远程路径,此路径即是七牛上传对象的key
func remoteKey(localFile string) string {
// 文件后缀,包含了点号"."
ext := path.Ext(localFile)
// 随机数字 转 字符串
rand.Seed(time.Now().UnixNano())
timeStr := strconv.Itoa(rand.Int())
// base64 编码,作为图片名的一部分
name := base64.StdEncoding.WithPadding(base64.NoPadding).EncodeToString([]byte(timeStr))
// 拼接
key := fmt.Sprintf("blog/%s%s", name, ext)
return key
}
编译
将编译后的程序命名为uppic
sh
go build -o uppic main.go
使用
在Typora中指定这个程序的路径,就可以在写markdown时,粘贴图片自动得到图片的url了。
当然这个程序也可以单独使用,为了方便单独使用,可以把程序放到环境变量PATH
指定的某个目录中,比如~/bin
(Mac默认的PATH
中不包含此目录,需要用户自己添加),保存到这个目录中以后,程序的路径就是~/bin/uppic
。
然后,可以在终端里面测试一下:
sh
which uppic
输出:
/Users/someuser/bin/uppic
直接使用程序:
sh
uppic flower.jpg
会输出图片的url,可以在markdown中使用这个url:
Upload Success:
https://xxx.xxx.xxx/abc/flower.jpg