typecho+typora自动下载七牛上的图片链接到本地
warning:
这篇文章距离上次修改已过516天,其中的内容可能已经有所变动。
typecho+typora自动下载七牛上的图片链接到本地
一、需求
- 习惯了typora写文章,想发到博客上时,图片处理显得比较麻烦。typecho原版不支持批量粘贴图片,一个个复制粘贴图片后还要进行版式处理,非常浪费时间。
刚开始想偷懒,觉得不如把图片放到图床(比如七牛)上,然后博客上做外链。因为typora上写的文章已经实现了批量将图片自动上传到七牛,并将:key:本地图片路径自动转化为云端的图片地址。但是由于博客启用了https,外链图片到七牛默认是http的,==https网站外链接http没法简单的实现==。七牛上要用https的话,得付费,刚开始觉得付费没关系,反正流量不会很大,但是看了七牛后台,没有做流量限制的地方,并且是后付费的,也就是哪天被刷流量的话,费用应该会爆表:cry:。
:key: typora图片自动上传到图床上,并自动转换图片链接,其实是用了picGo插件,当然也可以自己写个工具实现。
- 找了下网上,有第三方插件可以自动同步图片信息,甚至可以将文章粘贴后自动下载图片到本地,但是好像对版本有要求,要么就是要收费的,也不知好不好用。算了,就我这个简单的需求,还是自己写一下吧。
二、正片
找到var/Widget/Contents/Post/Edit.php,增加handleContent方法。
源码如下(
php不熟,写得比较随意,将就用吧
):/** * 处理内容,自动下载markdown中的图片标签 */ protected function handleContent(&$contents) : bool { $txt=$contents['text']; if(!$txt) { echo '文章内容不能为空!'; die(); return false; } // $str='xxxx![image-20230620002035747](/usr/uploads/20230627/1687799750_image-20230620002035747.png)sadf'; $pattern= '/!\[.*?\]\((http.*?\.(?:jpg|png|bmp))\)/'; // $pattern= '/!\[.*?\]\((http.*?\.(?:jpg|png|bmp))\)/'; $iCount=preg_match_all($pattern,$txt,$matchs); if($iCount<=0){//匹配不到,无须处理 // echo('匹配不到,无须处理!'); return true; } $urls=$matchs[1]; $created = new TypechoDate(); $date=$created->format('Ymd'); //创建上传目录 $uploadDir = Common::url(Upload::UPLOAD_DIR, __TYPECHO_ROOT_DIR__) ; $uploadDir="${uploadDir}/${date}"; if(!is_dir($uploadDir)){ if (!@mkdir($uploadDir, 0755)) { throw new \Typecho\Widget\Exception(_t('上传目录%s无法创建', $uploadDir)); return false; } } foreach($urls as $url){ $imgName=basename($url); $t=time(); $fName="${uploadDir}/${t}_${imgName}"; // 检查文件是否已经存在 if (file_exists($fName)) { // 文件已存在,无需重复下载 continue; } // 下载图片 file_put_contents($fName, file_get_contents($url)); // 替换Markdown文本中的图片链接为本地相对路径 $txt = str_replace($url, "/usr/uploads/${date}/${t}_${imgName}", $txt); } $contents['text']= $txt; return true; }
在WritePost()方法里保存或发表文章前处理文章中的图片链接。
$contents = self::pluginHandle()->write($contents, $this); //此处处理网络上的图片 if(!$this->handleContent($contents,$contents['created'])) return;
直观点可以看下面的图片:
至此typecho自动下载网络图的功能就算完成了,使用起来比之前方便多了!
微信:root6819 Q:302777528
评论已关闭