爬取指定路径图片至阿里云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条评论

发表评论