重大更新

2022年04月01日:使用本插件上传图片/文件到多吉云云存储无需每次手动获取sessionToken了!

以下配置文档已失效,最新的参考本插件仓库文档

特别感谢开发者@mingxuan的杰出贡献!

什么是多吉云

多吉云是一个融合CDN服务商,为用户提供融合CDN、云存储和视频云等服务,并且针对实名用户每月赠送一定量的产品免费额度,详情见《国内免费CDN和云存储评测分享》

关于融合CDN,你大概可以理解为:你从镇上买了许多优质大米,但是每年都有一些吃不完,所以你低价卖给了隔壁老王。尚不清楚多吉云是低价提供剩余服务还是专门做融合业务的,但我知道的是,他家的CDN节点主要来自腾讯云,而且流量包的价格几乎只有腾讯云做活动时候的一半。

关于云存储

提供云存储的服务商有很多,类似于大厂阿里云的OSS和腾讯云的COS,存储的文件安全性还是较高的。腾讯云的对象存储费用本身并不高,但除了存储费用之外,还有请求费、回源费和下行流量费,所以即便多次动心也忍住了使用腾讯云COS的想法。

而多吉云使用的是腾讯云COS或阿里云OSS作为存储空间的底层服务,并且为实名用户提供了10GB的免费额度,每月20GB的免费CDN流量,请求费、回源费和流量费什么的根本不存在。本着白嫖了不用太可惜的想法,我最终还是把博客的图片转移到了多吉云的云存储中。

为何要开发插件

此前犹豫要不要转移到多吉云云存储的原因之一就是,picgo没有现成的可以上传图片到多吉云的插件。在激活了typora之后,我想,要是每次写博客都去控制台上传图片,然后手动复制链接,粘贴到typora中,这样跟直接用vscode写博客有啥区别?

多吉云关于云存储和视频云的文档非常丰富,所以早在好几天前我就在看文档,准备整一个上传到多吉云的picgo插件。幸好,picgo现有一个AWS S3的上传插件,多吉云云存储支持AWS S3 SDK上传,但由于并非自家开发的底层存储服务,所以相较于通用的AWS S3 SDK上传,还要多携带一个临时sessionToken才行,于是我把wayjam 大佬的插件拿来改了一下,适配了多吉云上传。

“开发”思路

原本的S3上传插件功能较丰富,而多吉云除了需要额外携带sessionToken之外,有一些参数是不必要的,所以我要做的就是增加需要的东西,删除不必要的代码,保险起见,我还是仔细读了picgo插件开发的文档。

uploader是上传功能的核心之一,而sessionToken肯定是和accessKeyId secretAccessKey一同传输的,所以我在uploader.tsindex.ts中分别追加了sessionToken,此外,类似于regionPathStyleAccess等字段是上传到多吉云时不必要的参数(比如自定义节点和存储桶本身就包含了地区),于是在两个文件中删除了对应的参数。在现有的插件源文件中修改代码,测试可以正常上传。

此后,就是对编译前的源码进行修改,并且利用Github Action自动编译并发布包到npm。

插件code

使用条件

多吉云的存储空间有两种类型,只有标准型支持使用SDK和API上传、管理文件,所以使用本插件的必要条件就是必需创建一个标准型的存储空间

多吉云存储桶

而多吉云官方公告,自2021年5月21日起,标准型存储桶不再享受免费额度,也不支持图片处理和内容审核等高级功能,该日期之前创建的存储空间暂不受影响。

但是标准型存储空间的价格应该是0.003元/GB/日,所以即便你存了1GB的文件,一年下来费用也不过才一块钱左右,所以即便是白嫖用户也完全能够接受。

使用方法

得益于多吉云丰富的文档,和插件上手的简易度,使用该插件的方法非常简单。

安装插件

下载安装picgo-plugin-dogecloud插件,GUI可以直接在picgo的插件设置里搜索dogecloud再点安装即可。

picgo插件安装

获取临时密钥

前面提到过,多吉云并非使用自研的存储桶,所以获取到的密钥是有有效期的,临时密钥由accessKeyId secretAccessKey sessionToken三个字段组成,最长 2 小时有效期。技术说过,如有其它需求,可以用 Redis 缓存临时密钥,但对个人客户端使用来说意义不大。

获取临时密钥的方法也很简单,多吉云文档提供了一些现成的代码示例以供用户获取密钥。

以python获取为例,获取到的信息包含:accessKeyId secretAccessKey sessionToken s3Bucket s3Endpoint keyPrefix,其中,第四五项在云存储控制台的SDK参数也可找到,第六项为请求临时密钥时设定的允许上传的目录。

python获取临时密钥

填入配置

Key 说明 例子
accessKeyID 应用 ID
secretAccessKey 应用密钥
sessionToken 会话令牌
bucketName 存储桶名 s-gz-2384-xxxxxxx
urlPrefix 存储空间绑定的CDN域名 https://img.example.com
endpoint 指定上传的终端节点 https://cos.ap-guangzhou.myqcloud.com
uploadPath 上传路径 {year}/{month}/{fullName}
urlSuffix 自定义后缀 /shuiyin

同样,得益于前开发者的辛勤付出,本插件同样支持上传路径使用 payload。上传路径为空则默认以原始文件名上传到根目录,如指定目录则必需添加 payload:

payload 描述
{year} 当前日期 - 年
{month} 当前日期 - 月
{day} 当前日期 - 日
{fullName} 完整文件名(含扩展名)
{fileName} 文件名(不含扩展名)
{extName} 扩展名(不含.
{md5} 图片 MD5 计算值
{sha1} 图片 SHA1 计算值
{sha256} 图片 SHA256 计算值

上传路径可以是纯payload,也可以是目录+payload,比如pic/{fullName}

注意:上传路径不能只是目录!!!

插件配置图例

最后

所谓的”开发“本插件其实就是在前人的基础上进行改变,本身没有什么技术含量,但是这个过程确实又一次让我感受到了开源社区的美好和伟大,在此感谢多吉云免费提供的服务,也感谢所有开源项目的作者,互联网因为分享而精彩万分。

如果对项目有什么建议,欢迎在下面留言,或者直接给项目提PR,但就目前来说,应该无需什么修改了。

顺便说一下,我买了多吉云的CDN流量包,也设置了流量阈值,请某些别有用心的人不要再刷我CDN的流量了,感谢!