记一次博客图床迁移全过程

从建站之初,为有效节省服务器带宽、提升页面加载速度,本站所有图片均托管于图床。一路走来,历经无数次探索与尝试,前后共迁移了两次图床。起初,微博图床凭借其出色的稳定性和便捷性,成为了理想之选。但好景不长,微博图床开启防盗链机制,尽管后来通过反代等技术手段勉强解决了防盗链问题,可图片加载速度却大不如前,严重影响了用户体验。

那段时间,我对市面上各种免费图床进行了全面测试(付费图床因成本过高,暂不考虑),却发现结果都不尽人意。例如,路过图床因服务器位于海外,在国内访问速度较慢,且稳定性欠佳;SM.MS 图床加载速度迟缓;ImgURL 限制每日上传次数,使用起来极为不便;公益图床则限制繁多,难以满足需求。这些免费图床普遍存在限制条件多或加载速度慢的问题,用户数据安全更是难以保障。

一次偶然的机遇,我发现了阿里图床。严格来说,它并非传统意义上的图床,而是利用了阿里云客服的一个漏洞实现图片托管。尽管存在随时被阿里和谐的风险,但凭借大厂强大的 CDN 加持,图片加载速度极快。不知你是否留意,许多大厂网站都配备了识图功能,通过该功能上传的图片链接具有永久性。这也催生了诸如京东、百度等另类 “图床”,但使用这类图床,用户的数据安全往往得不到有效保障。

自微博图床防盗链后,本站一直使用阿里图床至今。期间,虽多次考虑更换图床,但因暂无严重问题且迁移过程繁琐,便一直搁置。然而,近期阿里图床频繁出现不稳定状况,部分图片无法加载,甚至出现 “429 错误”,严重拖累了整站的加载速度。在这种情况下,我不得已下定决心更换图床。

本次选用的方案是 Jsdelivr + Github + PicGo 。所有图片数据均存储在自己的 GitHub 仓库中,彻底解决了数据安全的后顾之忧。再配合 jsDelivr 全球 CDN 加速,图片加载速度大幅提升,体验直接 “起飞” 。

下载旧图片

更换图床的第一步是将旧的图片全部下载下来。由于之前使用的都是阿里图床的外链,我直接将数据库中的所有表导出为 SQL 文件,并下载到本地。接着,我使用正则表达式提取出所有图片链接。

在获取到图片链接后,接下来需要解决下载的问题。目前市面上主流的下载器似乎都不支持批量下载超过500个文件(后来发现 IDM 可以做到这一点)。因此,我编写了一个简单的 Python 脚本,将所有链接保存在 下载列表.txt 文件中,运行该脚本后,它可以实现自动去重并进行下载。以下是源码:

#!/usr/bin/env python3
# -*- coding:utf-8 -*-
import requests

# 声明全局变量
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36"
}
down_list = []

# 读取下载列表函数
def open_file(txt):
    global down_list
    try:
        file = open(txt, "r", encoding="utf-8")
        temp_lists = file.readlines()  # 取出每行作为数组
        for i in temp_lists:
            down_list.append(i.replace("\n", ""))
        print("共获取到" + str(len(down_list)) + "个下载任务!")
    except Exception as e:
        print(e)

# 下载函数
def download(url, name):
    r = requests.get(url, headers=headers, timeout=10)
    with open(name, "wb") as code:
        code.write(r.content)

# 列表去重函数
def check_list(lists):
    temp = []
    for i in lists:
        if not i in temp:
            temp.append(i)
    return temp

if __name__ == '__main__':
    open_file("下载列表.txt")
    final_list = check_list(down_list)
    for file_url in final_list:
        file_name = file_url.replace("https://ae01.alicdn.com/kf/", "")  # 删除url前缀
        download(file_url, file_name)

压缩旧图片

在成功下载了所有图片后,我发现以前的图片大多没有进行压缩。为了进一步优化存储空间,我决定对这些图片进行压缩。这里,我直接使用了 色彩笔 的在线工具进行批量压缩。结果令我满意,压缩后的图片大小竟然整整小了一倍,不仅节省了空间,也将大大减轻未来存储和传输的负担。

上传替换旧图片

在上传完所有图片到自己的 GitHub 仓库后,我准备进行最后一步操作:发布一个 releases,这样我就可以通过 jsDelivr 引用资源了。通过 jsDelivr 引用的方式是:https://cdn.jsdelivr.net/gh/你的用户名/你的仓库名/文件路径

然后,我直接在 VSCode 中打开了导出的 SQL 文件,使用 Ctrl + H 组合键进行批量替换。首先,我将阿里图床的域名前缀替换为了通过 jsDelivr 引用的新的前缀。如果你熟悉 SQL 也可以直接使用 SQL 语句来进行替换。替换完成后,我重新导入了 SQL 文件到数据库,从而成功完成了图床的更换。

注意:完成图床更换后,你需要重新检查一下 WordPress 主题设置中的信息是否需要调整,以免因为更换图床而出现一些问题。

评论区
头像
    头像
    送报少年
      

    {{se}} {{se}} {{se}}

    头像
    忘却
      

    遇见你很高兴

    头像
    歧途中の光
      

    (=・ω・=)

    头像
    歧途中の光
      

    说什么好呢……