习惯了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='xxxxsadf';
$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自动下载网络图的功能就算完成了,使用起来比之前方便多了!