picgo正确设置重命名文件,避免同文件重复上传

1.问题来源

在之前配置picgo+阿里云oss图床的博客中,我提到了需要开启picgo的时间戳重命名功能,以避免同名文件冲突。

  • 阿里云OSS默认策略:同名文件会被覆盖

现在看来,这个方法还是有一个缺点:那就是没有办法避免同一个文件的多次上传

说白了就是,我有一个图片,结果因为自己不小心多复制了几次,导致picgo多次上传了这个文件。再加上时间戳不同,之前上传的图片并不会被覆盖,而是留在那儿无人问津;

亦或者是开启了typora下图中对于网络位置的图片应用上述规则,同一个图片需要在一篇文章中出现两次,复制的时候,因为开启了该策略,typora自动帮你又上传了一遍;

image-20230124000807862

1.1 说明

阿里云OSS的空间是要付费的!对于个人博客图床而言,或许并不需要多少空间(本人使用阿里云OSS做图床已有1年,才用了980mb)

今天为了迁移其中一个bucket,发现了里面有非常非常多的重复文件,文件大小内容完全一致,这就是无意义的空间浪费,对于容量计费的oss来说,这可都是💴啊!

所以我们需要一个标识文件的方法,避免同一个文件的多次上传。

比较好的办法,那就是用文件的hash值来命名这个文件。此时,同一文件的hash值是一样的,上传到oss里面之后会直接覆盖,并不会多占用一份空间!我们的目的也就达到了

1.2 哈希

要想解决这个问题,我们需要引入一个概念:哈希;

所谓哈希,是一种编程中的数据结构思想,其方式是利用一些公式,将我们存储在计算机中的一个文件或者任何二进制流转换成一个固定长度的字符串。md5是哈希的其中一种算法,转换出来的字符串长度为32位。

哈希拥有一个特性:相同的字节数据,计算出来的哈希字符串结果一致。所以,只要计算出来的字符串结果相同,我们就可以认为这两个文件是相同的文件。

  • 图片a在第一次使用哈希算法计算的时候,得到的结果是123456;第二次图片a再用相同的哈希算法计算,得到的结果还是123456;
  • 文本文件text.txt,第一次用哈希算法计算的时候,得到的结果是abcd;第二次用相同哈希算法计算,得到的结果是abcd;第三次,我们修改了test.txt,得到的结果就变成了adck了,此时哈希结果不同,说明该文件和前两个文件已经不是同一个文件了;

上述只是哈希的最基础的一个概念,我们只需要记住,当两个文件使用相同的哈希算法,计算出来的哈希结果相同的时候,就可以认为他们是相同的文件。

哈希算法可能会出现”哈希碰撞“问题,即两个完全不同的文件,却计算出来相同的哈希结果的冲突问题。但是这个不是我们当前需要考虑的问题,即便是md5算法,能产生两个冲突的文件也是很难很难的。对于我们个人使用来说,更是完全不可能了。

所以,借用哈希的思想,我们可以修改picgo上传图片时候重命名的配置,让其用哈希结果来命名。这样,即便图片a被我们在不同的时间被上传,它最终也会匹配成相同名字的文件路径,在云端图床里面也只会存储一份。

2.使用picgo插件解决

实现这个需求,需要安装picgo的插件rename-image,作者是puppet或者liuwave(功能类似)

插件开源地址 liuwave/picgo-plugin-rename-file

2.1 安装

我的picgo是2.3.1版本的,能直接在插件市场安装。

image-20230124001818568

安装好了之后,在这里配置

image-20230124002213414

2.2 npm镜像源

picgo安装插件需要借助npm,如果你之前配置过hexo博客,那就是已经安装过node.js了。如果没有,则还需要根据提示,去node的官网上安装node.js,才能在picgo中安装插件。node.js官网:https://nodejs.org/zh-cn/

如果插件下载很慢,是因为npm默认使用的海外的下载源,用如下方式修改为国内的镜像源,二选一即可。将命令复制后,去电脑的CMD终端里面执行就可以了。

1
2
3
4
# 淘宝的
npm config set registry https://registry.npmmirror.com
# 或者阿里云的
npm config set registry https://npm.aliyun.com

配置了之后,重启picgo,再次尝试下载插件,应该就会快很多了。

2.3 配置

遵循仓库readme里面的配置方法

image-20230124002110651

这里我选择了比较简单的配置方法,年+月+哈希值

1
{y}/{m}/{hash}

这么做是为了避免hash值碰撞,虽然同一人能人工弄出两个hash碰撞的图片的可能性及其低,但加上一个年份和月份,可能性就更低了😂

这样就能保证在同一月上传的图片中,如果有相同图片会直接覆盖,不会多占用一份空间。

至于其他选项,参考文档。个人觉得没有太大必要,毕竟都上传到图床了,谁还管这个文件的原名和本地存储路径是什么呢?

3.收工

设置完毕之后,现在上传的图片命名格式如下

1
20234d48b94bd1054488005eb239741c807d.png

再次手动上传一遍这个相同的图片文件,发现返回的url是相同的。这样就相当于同一张图片,在oss中只会占用一次空间,不会多次重复的空间占用。

我们的目的就达到了!