PHP
爬取指定路径图片至阿里云OSS
爬取指定路径图片至阿里云OSS
博主最近完成了一个项目,需要将一组网络图片只替换域名,将图片保存至阿里云OSS上,在这个过程,需要将网络图片的域名去除,只保留文件夹路径名、文件名上传至阿里云OSS,所以需要对文件夹进行操作,我们先封装一个阿里云OSS公共方法,我们需要先下载阿里云OSS的SDK,代码如下:
USE OSS\OssClient; USE OSS\Core\OssException; require "OssUpload/autoload.php"; class AliYunUpload { /** * 上传本地文件至阿里云OSS * @param $object * @param $file * @return null */ function uploadFileImage($object, $file) { #配置OSS基本配置 $config = array( 'KeyId' => '对应ID', 'KeySecret' => '对应KeySecret', 'Endpoint' => '对应的Endpoint', 'Bucket' => '对应的Bucket', ); $ossClient = new OssClient($config['KeyId'], $config['KeySecret'], $config['Endpoint']); #执行阿里云上传 $result = $ossClient->uploadFile($config['Bucket'], $object, $file); #返回 return $result; } /** * 创建虚拟目录 * @param $object * @return null */ function createObjectDir($object) { #配置OSS基本配置 $config = array( 'KeyId' => '对应ID', 'KeySecret' => '对应KeySecret', 'Endpoint' => '对应的Endpoint', 'Bucket' => '对应的Bucket', ); $ossClient = new OssClient($config['KeyId'], $config['KeySecret'], $config['Endpoint']); #执行阿里云上传 $result = $ossClient->createObjectDir($config['Bucket'], $object); #返回 return $result; } /** * 判断目录是否存在 * @param $object * @return bool */ function doesObjectExist($object) { #配置OSS基本配置 $config = array( 'KeyId' => '对应ID', 'KeySecret' => '对应KeySecret', 'Endpoint' => '对应的Endpoint', 'Bucket' => '对应的Bucket', ); $ossClient = new OssClient($config['KeyId'], $config['KeySecret'], $config['Endpoint']); #执行阿里云上传 $result = $ossClient->doesObjectExist($config['Bucket'], $object); #返回 return $result; } }
然后就是一个公共处理文件,包括判断是否存在文件夹、创建文件夹、下载网络图片
/** * 获取线上地址并保存至本地获取基本信息 * @param $url * @return array */ function saveImage($url) { #判断线上图片是否存在 if(!@fopen($url, 'r')) { echo json_encode(array( 'code' => 404, 'msg' => '线上图片获取失败' )); } #上传图片至本地 $path = 'images/'; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30); $file = curl_exec($ch); curl_close($ch); $filename = pathinfo($url, PATHINFO_BASENAME); $resource = fopen($path . $filename, 'a'); fwrite($resource, $file); fclose($resource); $urls = "/www/images/" . $filename; //返回路径 return array( 'code' => 200, 'url' => $urls, 'filename' =>$filename ); } /** * 根据图片链接获取创建目录 * @param $url * @return bool|string */ function getObjectName($url) { //截取掉文件名 $lastIndex = strrpos($url, "/"); $noFileNameString = substr($url, 0, $lastIndex); #截取掉域名 //去掉第一次 $getFirstIndex = strpos($noFileNameString, "/") + 2; $getFirstIndexString = substr($noFileNameString, $getFirstIndex); //去掉第二次 $getTwoIndex = strpos($getFirstIndexString, "/") + 1; $getFirstIndexString = substr($getFirstIndexString, $getTwoIndex); //返回 return $getFirstIndexString; } /** * 保存图片至阿里oss * @param $url * @param array $objectList * @return array */ function uploadImageToOss($url, $objectList = array()) { $saveImage = saveImage($url); if ($saveImage["code"] !== 200) { return array( 'code' => 404, 'msg' => '上传本地失败' ); } //获取基本信息 $imageUrl = $saveImage["url"]; $filename = $saveImage["filename"]; #获取目录 $getObjectName = getObjectName($url); #创建目录 if (!isset($objectList[$getObjectName])) { //先获取再创建 $doesObjectExist = doesObjectExist($getObjectName); if ($doesObjectExist != 200) { //阿里OSS创建目录 createObject($getObjectName); } //存进目录数组 $objectList[$getObjectName] = $getObjectName; } #上传图片至阿里OSS $aliyun = new AliYunUpload(); $aliyun->uploadFileImage($getObjectName . "/" . $filename, $imageUrl); #删除本地图片 unlink('images/' . $filename); #返回目录数组 return array( 'code' => 200, 'objectList' => $objectList, 'ossImage' => $getObjectName . "/" . $filename ); } /** * 判断是否存在该目录 * @param $object * @return int */ function doesObjectExist($object) { $aliyun = new AliYunUpload(); $exitObject = $aliyun->doesObjectExist($object . "/"); if ($exitObject == true) { return 200; } else { return 400; } } /** * 创建目录 * @param $object */ function createObject($object) { //请求阿里 $aliyun = new AliYunUpload(); //触发创建 $data = $aliyun->createObjectDir($object); }
然后便是主程序,获取到了网络图片并且根据路径保存至阿里云OSS
//设置阿里oss文件目录【每次创建目录都会往里面丢目录路径】 $ossObjectList = array(); //爬取图片 $uploadImage = uploadImageToOss("网络图片地址", $ossObjectList); //判断 if ($uploadImage["code"] != 200) { echo "图片获取失败"; continue; } //重新设置目录数组 $ossObjectList = $uploadImage["objectList"]; //获取图片地址 $imgurlUrl = $uploadImage["ossImage"]; //输出阿里云OSS地址 echo $imgurlUrl
完成以上操作,我们便成功的将网络图片替换域名,上传到阿里云OSS。
0条评论