应用场景

  • 采集时图片没有入库
  • 之前所有图片都是站外链接

功能

批量更新 自动保存远程图片到本地
可匹配html与markdown两种格式

使用方法

首先确保已安装了 帝国万能API插件v1.0

新建一个接口,将下面代码复制到接口保存。再点击预览即可。

如果是下载源码直接导入模块,再找到接口 点击预览
ecmsapi_demo_datatools.zip (访问密码: 5981)或者下载本站内附件如下:
 

ecmsapi_demo_datatools.zip
fffb5c1ef76f0aaf5039bcaec916a637.zip (1.71 KB)

接口代码

<?php
defined("ECMSAPI_MOD") or exit;

$page = $api->get('page' , 0 , 'intval');
$page = $api->load('fun')->toInt($page , 1);

$docs = $api->load('db')->select('[!db.pre!]ecms_news_data_1' , '*' , 1 , '10,'.$page , 'id desc');

if(!$docs){
    $api->show('处理完成');
}

$uploader = $api->load('file' , [
    'mimes' => [
        'image/webp' => 'webp',
        'image/jpeg' => 'jpg',
        'image/gif' => 'gif',
        'image/png' => 'png'
    ]
])->setOption('size' , 1024*1024);

foreach($docs as $doc){
    $text = stripcslashes($doc['newstext']);
    $id  = $doc['id'];
    $classid = $doc['classid'];

    // 匹配md格式
    $text = preg_replace_callback('/\!\[(.*?)\]\((.*?)\)/is' , function($matches) use ($uploader , $doc){
        // 图片地址
        $url = trim($matches[2]);
        // 本地文件原样返回
        if(strpos($url , 'http://') !== 0 && strpos($url , 'https://') !== 0){
            return $matches[0];
        }
        // 将远程图片下载到本地
        $fileinfo = $uploader->download($url , $doc['id'] , $doc['classid']);
        // 下载失败原样返回
        if(!$fileinfo){
            return $matches[0];
        }
        return '!['.$matches[1].']('.$uploader->getFullPath($fileinfo).')';
    } , $text);

    // 匹配html格式
    $text = preg_replace_callback('/<\s*img\s+[^>]*?src\s*=\s*(\'|\")(.*?)\\1[^>]*?\/?\s*>/i' , function($matches) use ($uploader , $doc){
        // 图片地址
        $url = trim($matches[2]);
        // 本地文件原样返回
        if(strpos($url , 'http://') !== 0 && strpos($url , 'https://') !== 0){
            return $matches[0];
        }
        // 将远程图片下载到本地
        $fileinfo = $uploader->download($url , $doc['id'] , $doc['classid']);
        // 下载失败原样返回
        if(!$fileinfo){
            return $matches[0];
        }
        return str_replace($url , $uploader->getFullPath($fileinfo) , $matches[0]);
    } , $text);

    $api->load('db')->update('[!db.pre!]ecms_news_data_1' , ['newstext' => $text] , 'id='.$id);
}

$jumpurl = './index.php?mod='.ECMSAPI_MOD.'&act='.ECMSAPI_ACT.'&page='.($page+1);

$html = <<<HTML
    第{$page}页处理完成,即将跳转到下一页!
    <script type="text/javascript">
        setTimeout(function(){
            window.location.href = "{$jumpurl}";
        }, 1000);
    </script>
HTML;
$api->show($html);
上传的附件: