全篇转载,原文链接:gitee 图床因外链访问过多被封,我们该怎么办
一、事件起因
今天下午正在思考人生呢,突然收到 gitee 官方发来的邮件
赶忙上网查相关信息,发现 3.25 日 gitee 官网对仓库外链进行了一波清查
好家伙,自己 typora 里有几百篇文章呢,现在全部变成了这种画风
欣慰的是,CSDN 和 公众号上的文章在上传前,会重新拉去一次图片再转存到自己的服务器上,所以受到波及的只有自己的 typora
二、方案选择
固然,gitee 被封了,还有 github 可以选择,但是尝试过用 github 做图片库,上传速度实在感人,故放弃
免费的方案还有微信小程序图床和哔哩哔哩图床,但是二者不知道后续经营状况如何,也不知道后续收费情况如何,因为图床最重要的一点就是稳定,故放弃
目前看来,只有各大公司提供的 OSS 服务比较靠谱了,这里最终选择阿里云的 OSS 服务
鉴于我们只需要存储图片,单个图片大小控制在 50kB 以内,以一篇文章50个图片来统计,就算天天写文章,一年流量上行也超不过 1G,所以买 40G 流量包足以
趁着优惠,一口气买了三年,也只要24元:
具体的 OSS 购买和配置流程,可以点击下面这个链接观看:
三、资源替换
在确认配置完 OSS ,并能成功上传后,我们进行接下来的操作
1、解封原 gitee 库
我们需要获取之前的所有图片资源,因为之前每次上传时,都会将图片以时间戳的形式赋予一个唯一名称,这在我们后面换访问连接的时候是至关重要的
但是在仓库被封的情况下,我们是无法去下载的
这个时候就需要声泪俱下的给 gitee 官方写一封信
快的话,大概等一天左右就会解封,这个时候赶快将仓库资源下载下来
2、上床资源到 OSS
下载完成后,我们将文件夹解压并上传到我们的 OSS
上传前必须选择 公共读,不然可能 typora 无法访问
3、单篇文章图片访问路径替换
我们观察一下 gitee 和 oss 上传后返回的图片访问路径,只有指向不同服务器的前缀不一样,所以只要替换这部分就行
我们直接在 typora 中快捷键 commend+f 查找替换即可
4、全文件夹图片访问路径替换
很可惜 ,typora 只支持单篇文章全文替换,整个文件夹文件内容无法直接替换,这里我们自己写个脚本解决
替换前,先将我们当前的 typora 文章库做个备份,避免出现意料之外的结果
接下来,运行下面这段 java 脚本
运行前别忘了替换 <> 里的内容
import java.io.*; import java.util.ArrayList; import java.util.List; import java.util.Scanner; /** * @ClassName ChangePicPath * @Description 修改指定文件夹中的所有信息 * @Author faro_z * @Date 2022/3/26 5:18 下午 * @Version 1.0 **/ public class ChangePicPath { private static String folderName = "<你的文章所在的文件夹的全路径名>"; private static String from = "<图片访问路径中待替换的部分>"; private static String to = "<图片访问路径中被替换成的部分>"; private static List<String> errFileNameList = new ArrayList<>(); public static void main(String[] args) throws IOException { List<String> pathList = getAllFileName(folderName); System.out.println("成功获取所有文件名称!"); System.out.println("第一个文件名称为:"+pathList.get(0)); // 如果发现文件名称和预期的不一样,别误操作了 System.out.println("输入任意数字,再按回车键继续..."); new Scanner(System.in).nextInt(); int errCount = 0; for (String path : pathList) { if (!changeFileContent(from,to,path)) { errCount++; } } System.out.println("出错文件数为:"+errCount); System.out.println("所有出错文件名为:"); for (String errPath : errFileNameList) { System.out.println(errPath); } } /** * 获取当前文件夹下所有文件名(不包括文件夹名) * @param folderName * @return */ private static List<String> getAllFileName(String folderName) { ArrayList<String> filePathList = new ArrayList<>(); dfs(folderName,filePathList); return filePathList; } /** * 递归获取文件名 * @param path * @param filePathList */ private static void dfs(String path, List<String>filePathList) { File file = new File(path); if (file.isFile() && file.getName().endsWith(".md")) { filePathList.add(file.getAbsolutePath()); return; } if (file.isDirectory()) { File[] files = file.listFiles(); for (File tmpFile : files) { dfs(tmpFile.getAbsolutePath(),filePathList); } } } private static boolean changeFileContent(String from,String to,String filePath) { File file = new File(filePath); try { FileReader fileReader = new FileReader(file); BufferedReader bufferedReader = new BufferedReader(fileReader); CharArrayWriter tempStream = new CharArrayWriter(); String line = null; while ((line = bufferedReader.readLine()) != null) { line = line.replaceAll(from,to); tempStream.write(line); tempStream.append(System.getProperty("line.separator")); } bufferedReader.close(); // 将内存中的流 写入 文件 FileWriter out = new FileWriter(file); tempStream.writeTo(out); out.close(); } catch (IOException e) { errFileNameList.add(filePath); return false; } return true; } }
运行结束后,我们再看看之前的文章
可以返发现,已经全部恢复了