【转】gitee 图床因外链访问过多被封,我们该怎么办

全篇转载,原文链接:gitee 图床因外链访问过多被封,我们该怎么办

一、事件起因

今天下午正在思考人生呢,突然收到 gitee 官方发来的邮件

gitee被封

赶忙上网查相关信息,发现 3.25 日 gitee 官网对仓库外链进行了一波清查

好家伙,自己 typora 里有几百篇文章呢,现在全部变成了这种画风

素材2

欣慰的是,CSDN 和 公众号上的文章在上传前,会重新拉去一次图片再转存到自己的服务器上,所以受到波及的只有自己的 typora


二、方案选择

固然,gitee 被封了,还有 github 可以选择,但是尝试过用 github 做图片库,上传速度实在感人,故放弃

免费的方案还有微信小程序图床哔哩哔哩图床,但是二者不知道后续经营状况如何,也不知道后续收费情况如何,因为图床最重要的一点就是稳定,故放弃

目前看来,只有各大公司提供的 OSS 服务比较靠谱了,这里最终选择阿里云的 OSS 服务

鉴于我们只需要存储图片,单个图片大小控制在 50kB 以内,以一篇文章50个图片来统计,就算天天写文章,一年流量上行也超不过 1G,所以买 40G 流量包足以

趁着优惠,一口气买了三年,也只要24元

image-20220326183822886

具体的 OSS 购买和配置流程,可以点击下面这个链接观看:

ytpora+picgo+oss配置教程



三、资源替换

在确认配置完 OSS ,并能成功上传后,我们进行接下来的操作


1、解封原 gitee 库

我们需要获取之前的所有图片资源,因为之前每次上传时,都会将图片以时间戳的形式赋予一个唯一名称,这在我们后面换访问连接的时候是至关重要的

但是在仓库被封的情况下,我们是无法去下载的

这个时候就需要声泪俱下的给 gitee 官方写一封信

快的话,大概等一天左右就会解封,这个时候赶快将仓库资源下载下来


2、上床资源到 OSS

下载完成后,我们将文件夹解压并上传到我们的 OSS

上传前必须选择 公共读,不然可能 typora 无法访问

3、单篇文章图片访问路径替换

我们观察一下 gitee 和 oss 上传后返回的图片访问路径,只有指向不同服务器的前缀不一样,所以只要替换这部分就行

我们直接在 typora 中快捷键 commend+f 查找替换即可

image-20220326190147518


4、全文件夹图片访问路径替换

很可惜 ,typora 只支持单篇文章全文替换,整个文件夹文件内容无法直接替换,这里我们自己写个脚本解决

替换前,先将我们当前的 typora 文章库做个备份,避免出现意料之外的结果

素材1

接下来,运行下面这段 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;
    }
}

运行结束后,我们再看看之前的文章

可以返发现,已经全部恢复了

恢复


猜你喜欢

转载自blog.csdn.net/a_piece_of_ppx/article/details/124908241