应用场景
- 采集时图片没有入库
- 之前所有图片都是站外链接
功能
批量更新 自动保存远程图片到本地
可匹配html与markdown两种格式
使用方法
首先确保已安装了 帝国万能API插件v1.0
新建一个接口,将下面代码复制到接口保存。再点击预览即可。
如果是下载源码直接导入模块,再找到接口 点击预览
ecmsapi_demo_datatools.zip (访问密码: 5981)或者下载本站内附件如下:
接口代码
<?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);