php远程图片下载并上传到七牛空间
最近在做一个社区系统,编辑器采用的是wangeditor,因为编辑器没有远程图片下载功能所以自己扩展了一个!php远程图片下载功能实现步骤:
1、将编辑器中所有html获取到并用正则匹配出所有图片地址
var list = html.match(/src=[\'\"]?([^\'\"]*)[\'\"]?/gi);
2、将所有匹配到的图片地址发送到后端处理
3、将图片在后端用Client下载下来并上传到七牛(如果需要图像处理可以用Intervention Image完成)后返回所有信息
4、将所有之前的图片地址替换成新图片地址并将html源码设置到编辑器中
获取编辑器代码中的所有图片
/**
* 获取图片列表
* @param html//传入html代码
* @returns {*[]}
*/
GetImage(html){
// 正则匹配出所有图片
var list = html.match(/src=[\'\"]?([^\'\"]*)[\'\"]?/gi);
// 七牛链接的内容(如果图片链接包含该内容表示上传的图片)
var searchStr = 'image.zhuansky.com';
var Arr = [];
if (list != null){
for (var i=0;i<list.length;i++){
//判断图片是否是外链的图片
if(list.indexOf(searchStr)==-1){
// 替换匹配时候出现的多余字符
list = list.replace('src="','');
Arr = list.replace('"','');
}
}
}
return Arr;
}
// 下载远程图片 菜单点击事件
clickHandler() {
// 获取编辑器的内容
var html = editor.txt.html();
//获取图片列表
var list = this.GetImage(html);
//如果存在图片则获取
if (list.length > 0){
// 显示加载图标
var index = layer.load(1, {
shade: //0.1透明度的白色背景
});
// 发送到后台
$.ajax({
headers: {'X-CSRF-TOKEN': $('Meta').attr('content')},
type:'POST',
url:'/down_remote_img',
data:{'list':list},
success:function (v) {
if(ajaxStatus(v.status)==1){
var data = v.data;
var data_list = data.list;
console.log(data_list.status);
console.log(data_list.source);
console.log(data_list.url);
console.log(html.replace(data_list.source,data_list.url));
//开始替换内容中的所有链接
for (var i=0;i<data_list.length;i++){
if (data_list.status==1){
html = html.replace(data_list.source,data_list.url);
}
}
editor.txt.html(html);
//关闭加载图标
layer.close(index);
//显示信息
var message = data.total==data.success
? '图片下载成功'
: "图片共有{data.total}个,成功{data.success}个,失败{data.error}个"
;
layer.msg(message);
}
}
});
}
}
php抓取远程图片方法
/**
* 抓取远程图片
* @param $iamgeList Array 接收的图片地址列表
* @return Array
*/
private function catcher(Array $imageList){
$list = [];
$success = $error = 0;
$client = new Client(['verify'=>false]); //忽略SSL错误
$Storage = \Storage::disk('qiniu');
foreach($imageList as $val){
if(!empty($val)){
if(strpos($val,'http://') == 0 || strpos($val,'https://') == 0){
$data = $client->get($val)->getBody()->getContents();//获取图片内容
$ImageInfo = pathinfo(parse_url($val)['path']); //获取图片信息
$ImageWidth = Image::make($data)->height(); //获取图片宽度
$Image_Width_Max = get_config('Image_Width_Max'); //图片最大允许
$FileName = time()."_".mt_rand(10000,999999).".".$ImageInfo['extension'];
//判断图片宽度是否超出最大限制
if($ImageWidth > $Image_Width_Max){
$data = Image::make($data)->widen($Image_Width_Max)->encode($ImageInfo['extension']);
}
//上传图片
$Storage->put($FileName,$data);
//判断图片是否上传成功
$status = $Storage->exists($FileName);
if($status){
$list[] = [
"status" =>1,
"url" => $Storage->url($FileName),
"size" => $Storage->size($FileName),
"title" => $FileName,
"original" => $FileName,
"source" => $val
];
$success++;
}else{
$list[] = [
"status" =>0,
"source" => $val
];
$error++;
}
}
}
}
return [
'total'=>count($imageList),
'error'=>$error,
'success'=>$success,
'list'=> $list
];
}
/**
* 下载远程图片
* @param Request $request
* @return void
*/
function downRemoteImg(Request $request){
if (count($request->list) > 0){
$data = $this->catcher($request->list);
return ['status'=>1,'message'=>'设置成功','data'=>$data];
}
return ['status'=>0,'message'=>'错误!'];
}
页:
[1]