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条评论