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;

    直观点可以看下面的图片:

    image-20230627011153992

    至此typecho自动下载网络图的功能就算完成了,使用起来比之前方便多了!

    微信:root6819     Q:302777528
none
最后修改于:2023年06月27日 01:15

评论已关闭