完了,二哥网站的图片挂了_沉默王二知识星球-程序员宅基地

技术标签: java  Java进阶之路  开发语言  

二哥的编程知识星球正式开放了,这是一个Java学习指南+编程实战的学习宝地,可以帮助你提高编程能力、养成好的学习习惯、找到志同道合的学习伙伴、拿到更好的 Offer。详情戳链接《Java程序员进阶之路》!

大家好,我是二哥!

很早之前,就有小伙伴给我反馈说《Java 程序员进阶之路》经常有图片不显示或者加载缓慢。

但由于白嫖(GitHub图床+jsdelivr CDN)的力量实在是太过强大了(狗头),再加上我本人没有遇到过这个问题,所以就一直拖延着,迟迟没有行动。

直到某一天,我神秘的流量用光了,上不去了谷歌,访问不了 X 网,我才发现,原来我的网站加载图片这样慢啊!!!!经常是一蹦一蹦出来的,肉眼(带近视镜)可见的慢。

事没到自己头上,显然高高挂起,可一旦事搁到自己头上,就受不了了呀!

于是我打开站长工具检测了一下图片的访问速度,好家伙,我直接好家伙!国内的访问速度能飙到 100ms,国外的确实快,只有 14.7ms,

要知道,网站面对的用户群体大多数都是国内的小伙伴,这速度,真的是劝退用户!

再加上我今天看到小林把自己的网站也升级了自己的图床,所以我就也按捺不住了。

怎么办?

不可能一个个手动替换啊,《Java 程序员进阶之路》上少说也有 200 篇文章,一篇文章平均 5 张图片的话,也得 1000 张吧,全部替换下来还不得疯!

由于我本地已经分门别类的保存了所有的图片,就只剩下:

  • 第一步,把图片上传到某云厂商
  • 第二步,批量替换所有文章中的图片链接为新图床的地址

替换链接的思路也比较简单,就是读取所有 md 文件,找到其中的图片地址,按照下图的方式替换即可。

第一步,上传图库到云厂商

直接选择扫描文件夹就可以把所有的图片上传到新的图床里。

PS:这里有个坑,不知道有眼尖的小伙伴看出来了没?

第二步,开启 CDN

只使用 OSS 的话,除了流量计费比较高一点外,就是图片没有进行加速服务,所以我就顺带开启了 CDN 服务。开启方法非常简单,只需要将域名回源到 OSS 就可以了。

第三步,编写 Java 代码批量转链

@Slf4j
public class ConvertAllFileWithPool {
    
    public static final String img_url_pre_before = "https://cdn.jsdelivr.net/gh/itwanger/toBeBetterJavaer/images/";
    private final static String img_url_pre_after = "http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/images/";
    private final static String docPath = "/Users/maweiqing/Documents/GitHub/toBeBetterJavaer/docs/";

    public static void main(String[] args) throws IOException {
    
        // 递归遍历目录以及子目录中的所有文件
        List<File> files = FileUtil.loopFiles(docPath);
        log.info("总文件数{}",files.size());

        ExecutorService executorService = Executors.newCachedThreadPool();
        for (File file: files) {
    
            if (FileNameUtil.isType(file.getName(), "md")) {
    
                log.info("MD 文件{}", file.getName());
                executorService.submit(() -> {
    
                    FileReader fileReader = FileReader.create(file, Charset.forName("utf-8"));
                    String result = fileReader.readString().replaceAll(img_url_pre_before,img_url_pre_after);
                    log.info("转换完毕");
                    try {
    
                        FileWriter writer = new FileWriter(file);
                        writer.write(result);
                        writer.flush();
                    } catch (IOException e) {
    
                        log.error("写入文件出错了{}", e);
                    }
                });
            }
        }
    }
}

思路非常简单,也没有多少行代码:

  • 通过 hutool 的 FileUtil.loopFiles() 方法递归遍历目录以及子目录中的所有文件;
  • 通过 Executors.newCachedThreadPool() 创建一个缓存线程池,由于最多 1087 个文件,所以不用担心线程池资源耗尽;也就不用严格按照阿里手册上强制要求的不能使用 Executors 创建线程池,因地制宜;
  • 循环遍历所有文件,通过 FileNameUtil.isType() 过滤掉不是 md 的文件;
  • 通过 FileReader 读取文件内容,并通过 String 类的 replaceAll() 方法替换原有的图片链接;
  • 通过 FileWriter 重新写入文件;

来看一下执行日志:

17:29:30.547 [main] INFO top.image.ConvertAllFileWithPool - 总文件数1087
。。。
17:29:30.649 [main] INFO top.image.ConvertAllFileWithPool - MD 文件flow-control.md
17:29:30.649 [pool-1-thread-12] INFO top.image.ConvertAllFileWithPool - 转换完毕
17:29:30.649 [pool-1-thread-4] INFO top.image.ConvertAllFileWithPool - 转换完毕
17:29:30.649 [pool-1-thread-8] INFO top.image.ConvertAllFileWithPool - 转换完毕
17:29:30.649 [pool-1-thread-5] INFO top.image.ConvertAllFileWithPool - 转换完毕

基本上不到一秒钟就完成了,因为有 GitHub 作为版本仓库,所以我们可以放心大胆地执行,不用担心出错,大不了重来就是了。

大概检查几个文件后,发现 OK,就可以把修改后的文件提交到版本库了。

重新部署网站后,打开站长工具重新测试了一下图片的访问速度,这次就快多了,国内基本上都是在 20ms 左右,这比原来的 100ms 快了五分之四啊!

早知道这样子,我就早切换链接了!

小插曲

本地图片上传 OSS 的时候一点没注意,多了一个 images 的目录,就导致我构建网站后,发现图片全部挂了!

人慌了好一阵子,OSS 也没提供移动资源的功能,索性就只能在 md 文件中多加了一个 images 目录,这下只能将错就错了。

充了 100 块钱,不知道能用多久,OSS+CDN,链接中没敢用 HTTPS,因为 HTTPS 也收费,就先用 HTTP 了。

好了,今天是五一劳动节,大早上起来我就在星球里制定了五月份的学习计划,不少球友都响应了,也制订了自己的学习计划。

药卷一起卷(狗头)


没有什么使我停留——除了目的,纵然岸旁有玫瑰、有绿荫、有宁静的港湾,我是不系之舟

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qing_gee/article/details/124519354

智能推荐

JAVA设计模式(06):结构型-适配器模式(Adapter)_技软件公司在很久以前曾开发了一个算法库,里面包含了一些常用的算法,例如排序算法-程序员宅基地

文章浏览阅读5k次。我的笔记本电脑的工作电压是20V,而我国的家庭用电是220V,如何让20V的笔记本电脑能够在220V的电压下工作?答案是引入一个电源适配器(AC Adapter),俗称充电器或变压器,有了这个电源适配器,生活用电和笔记本电脑即可兼容,如图1所示:图1 电源适配器示意图 在软件开发中,有时也存在类似这种不兼容的情况,我们也可以像引入一个电源适配器一样引入一个称之_技软件公司在很久以前曾开发了一个算法库,里面包含了一些常用的算法,例如排序算法

Python模拟MQTT v3.1.1服务器_python mqtt服务器-程序员宅基地

文章浏览阅读1.7k次,点赞2次,收藏6次。配置文件通常位于 Mosquitto 安装目录的 \mosquitto\mosquitto.conf 或 \mosquitto\mosquitto.conf 文件中。重新运行代码:在完成以上步骤后,关闭并重新打开命令行窗口,然后再次运行你的代码,系统应该能够找到并启动mosquitto命令。将Mosquitto MQTT服务器软件的安装路径添加到系统的环境变量中,这样系统就能够找到mosquitto命令。在编辑窗口中,点击“新建”按钮,并将Mosquitto MQTT服务器软件的安装路径添加进去。_python mqtt服务器

1分钟搭建完成PalWorld(幻兽帕鲁)游戏服务器-程序员宅基地

文章浏览阅读864次,点赞20次,收藏25次。这游戏比较吃内存,所以内存尽量在16G以上(Pocketpair官方的推荐配置是4vCPU 16G),CPU选4vCPU即可,带宽方面推荐不限流量的固定带宽,延时低,畅玩体验更佳。在这里,阿里云的服务把大部分游戏需要的配置都帮你配好了,包括网络端口设置(UDP 协议访问 8211 端口)、游戏环境安装等,全程只要点击几下鼠标即可。2、在“新建批量管理软件任务”页面中,默认已选中“幻兽帕鲁”以及最新版本,只需要展开“选择实例”并选中要安装幻兽帕鲁的ECS实例即可。配置完成之后,点击下一步,确认提交订单。

AI论文速读 | ST-LoRA:低秩适配的时空预测-程序员宅基地

文章浏览阅读321次,点赞3次,收藏5次。时空预测在现实世界的动态系统中至关重要,它利用来自不同地点的历史数据来预测未来的变化。现有的方法通常优先考虑开发复杂的神经网络来捕获数据的复杂依赖性,但其准确性未能显示出持续的改进。此外,这些方法还忽视了节点的异构性,阻碍了定制预测模块有效处理不同的区域节点。本文目标不是提出一种新模型,而是提出一种新颖的低秩适配框架,作为现有时空预测模型的现成插件,称为ST-LoRA,它通过以下方式缓解上述问题: 节点级调整。具体来说,首先定制一个包含多个可训练低秩矩阵的节点自适配低秩层。

德州CC2640R2f蓝牙芯片学习笔记(三)ti_rto学习_cc2640r2frgzr 蓝牙例程-程序员宅基地

文章浏览阅读856次。目录前言:一、本系列文章由江山(csdn名:补不补布)(github:jianggogogo)自己写成,当中用到引用时都已经标记出来,如果出现版权问题,请直接联系我修改。当然,技术在于分享,欢迎大家转载,不过请注明出处。最后,如果出现有错误的地方欢迎大家指正。前言:本文基于谷雨cc2640r2f教程所编写,是一篇学习笔记。一、..._cc2640r2frgzr 蓝牙例程

安装LFS6.3 VFS:Cannot open root device "sda" 或VFS:Unable to mount root fs on unknown-block(0,0)_qemu vfs: cannot open root device "/dev/sda" or un-程序员宅基地

文章浏览阅读5.7k次。LFS:6.3宿主机OS:lfshost这两天一直在安装lfs6.2,安装到最后编译完内核,修改完fstab,最后安装grub后,启动lfs报错提示 VFS:Cannot open root device "sda" or unknow-block(0,0)Please append a correct "root=" boot optionkernel panic:VFS:Unable to_qemu vfs: cannot open root device "/dev/sda" or unknown-block(0,0): error -6

随便推点

python GDAL遥感影像创建缩略图_tif 生成缩略图-程序员宅基地

文章浏览阅读754次。利用Translate创建缩略图功能,指定缩略图宽度为1024,等比例缩放。_tif 生成缩略图

RIL/QCRIL架构及基本流程_芯片ril是啥-程序员宅基地

文章浏览阅读1.6k次。通过之前章节的讲述我们已经知道,libril属于Google原生的逻辑,MTK和高通公司都在使用这套原始逻辑,而libril的下层则是各个芯片厂商为了适配各自的芯片而自己开发的一套处理逻辑。QCRil则是高通公司为适配自己的modem芯片而开发的自己消息处理逻辑。里面主要是将请求消息、请求响应及主动上报消息封装成QMI消息进行传递。据高通的说法,使用qmi消息的机制可以传输效率更高,更稳定。_芯片ril是啥

基于Java图书管理系统的设计与实现 毕业设计开题报告_基于java的图书管理系统国外研究现状及分析-程序员宅基地

文章浏览阅读710次,点赞2次,收藏4次。基于Java图书管理系统的设计与实现 毕业设计开题报告,大学生本科专科专升本成人教育毕业设计毕设开题报告模板,研究背景与意义、国内外研究现状、、研究思路与方法、研究内客和创新点、后台功能需求分析和前端功能需求分析、研究思路与研究方法、可行性、研究进度安排、论文(设计)写作提纲、主要参考文献_基于java的图书管理系统国外研究现状及分析

一文带你了解webrtc基本原理(动手实现1v1视频通话)_webrtc的原理-程序员宅基地

文章浏览阅读3.5k次,点赞6次,收藏30次。webrtc (Web Real-Time Communications) 是一个实时通讯技术,也是实时音视频技术的标准和框架。大白话讲,webrtc是一个集大成的实时音视频技术集,包含了各种客户端api、音视频编/解码lib、流媒体传输协议、回声消除、安全传输等。对于开发者来说可以借助webrtc非常方便的实现低延时视频通话能力。现在主流的直播系统、会议系统基本都是基于webrtc来实现。..._webrtc的原理

QT实现客户端服务器HTTP(get请求、post请求)_qt实现http服务器-程序员宅基地

文章浏览阅读8k次,点赞10次,收藏96次。使用QT网络编程实现服务端和客户端的HTTP请求的PSOT、GET请求。_qt实现http服务器

生成汉字串首字母串_if char like "[一-龥]" or ascw(char) >= 19968 and as-程序员宅基地

文章浏览阅读8.8k次。Unicode共收录20901个汉字,编码从19968到40869在ASP里,取汉字的UNICODE码要用ascW()函数来取相反,用chrW来反解码,搞了下午才搞到这个对照表function GetPy4utf(char)if char=null or len(trim(char))=0 then exit functiondim strCHSfirstPYstrCHSfirstPY ="_if char like "[一-龥]" or ascw(char) >= 19968 and ascw(char) <= 40869 then

推荐文章

热门文章

相关标签