前言

这次分享一个文件,可以直接把Typecho之前远程服务器的文件转存到本地服务器并更改路径,因为博主之前是wordpress系统转过来的,发现之前的图片路径就没有保存到本地,所以就研究了这么一个东西出来。之前在网上也找过很多类似的,但是都不是很好。下面放出博主写的。先看一下下面这段代码吧!。

代码

<?php

/**
 * 获取图片名称
 * @param  string $url     图片的地址
 * @param  string $header  图片的响应头信息
 * @return string 返回文件名或空
 */
function getImgName($url, $header)
{
    $image_name = '';

    /* 从URL中获取文件名 */
    $tmp_name = getNameFromURL($url);
    /* URL中不包含文件名 */
    if (empty ($tmp_name))
    {
        $tmp_name = getNameFromHeader ($header);
    }

    /* 文件名不为空 */
    if (!empty ($tmp_name))
    {
        /* 但是文件名中不包含扩展名 */
        if(!strpos ($tmp_name, '.'))
        {
            $tmp_ext = getExt ($url, $header);
            /* 从头信息中获取的文件扩展名不为空 */
            if (!empty ($tmp_ext))
            {
                $image_name = sprintf("%s.%s", $tmp_name, $tmp_ext);
            }
        }
        /* 文件名中包含扩站名 */
        else
        {
            $image_name = $tmp_name;
        }
    }
    /* 头信息中没有文件名 */
    else
    {
        $image_name = '';
    }

    return $image_name;
}

/**
 * 获取图片的扩展名,先通过分析响应头信息中的Content-type的信息来确定
 * 然后通过分析图片的地址URL来获取扩展名
 * @param  string $url     图片的地址
 * @param  string $header  图片的响应头信息
 * @return string 返回扩展名或空
 */
function getExt($url, $header)
{
    $file_ext = '';
    $file_ext = getExtFromHeader ($header);
    if (empty ($file_ext))
    {
        $file_ext = getExtFromURL ($url);
    }

    return $file_ext;
}

/**
 * 通过分析图片的地址URL来获取扩展名
 * @param  string $url     图片的地址
 * @return string 返回扩展名或空
 */
function getExtFromURL($url)
{
    $name = getNameFromURL ($url);
    $ext = '';
    if (!empty ($name) && strpos ($name, '.') !== false)
    {
        $ext = substr ($name, strrpos ($name, '.'));
    }

    return $ext;
}

/**
 * 通过图片地址URL获取图片名称
 * @param  string $url  图片地址
 * @return string 返回文件名或空
 */
function getNameFromURL($url)
{
    $name = '';
    /* URL中包含文件名 */
    if (preg_match ('/\/([^\/]+\.[a-z]{3,4})(\?.*?)?$/i',$url, $matches))
    {
        $name = $matches[1] ? trim ($matches[1]) : '';
    }

    return $name;
}

/**
 * 通过分析响应头信息中的Content-type的信息获取扩展名
 * @param  string $header  图片的响应头信息
 * @return string 返回扩展名或空
 */
function getExtFromHeader($header)
{
    $file_ext = '';
    if (preg_match ('/Content-Type: image\/(.*?)\n/', $header, $matches))
    {
        $file_ext = $matches[1] ? trim ($matches[1]) : '';
    }

    return $file_ext;
}

/**
 * 通过分析图片响应头信息获取图片名称
 * @param  string $header  图片的响应头信息
 * @return string 返回文件名或空
 */
function getNameFromHeader($header)
{
    $file_name = '';
    if (preg_match('/Content-Disposition:.*?filename="([^"]+)".*?\n/', $header, $matches))
    {
        $file_name = $matches[1] ? trim($matches[1]) : '';
    }

    return $file_name;
}

$conn =  new mysqli('localhost', '账户', '密码','数据库名');//数据库信息修改为你自己的数据库账号信息
if($conn!=null){
    $sql = "select * from typecho_contents where type = 'post' order by cid asc";//jq_contents修改为你的数据库中的contents表名称
    $query_result = $conn->query($sql);
    echo $query_result->num_rows.'<br/>';
    while($row = $query_result->fetch_assoc())
    {
        echo $row["cid"];
        //  /(?<=<img.*?src=")(http://.*?)(?=")/
        $newtext=$row['text'];
        preg_match_all('/<img.*?src="http:\/\/.*?"/u',$newtext , $matches);//匹配规则
        foreach($matches[0] as $imgUrl)
        {
            preg_match('/(?<=src=")(http:\/\/.*?)(?=")/',$imgUrl,$imgUrl);
            var_dump($imgUrl);
            $imgUrl=$imgUrl[0];
            //配置文件目录
            $imgXdPath="\\usr\\uploads\\images\\".$row['created']."\\";
            $imgPath=str_replace(str_replace("/","\\",$_SERVER['PHP_SELF']),'',__FILE__).$imgXdPath;

            //判断路径是否存在
            if(!is_dir($imgPath)){
                $res=mkdir($imgPath,0777,true);
                if(!$res){
                    echo "失败";
                }
            }
            $curl = curl_init();
            //下载图片
            curl_setopt($curl, CURLOPT_URL, $imgUrl);
            curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($curl, CURLOPT_CONNECTTIMEOUT,0);
            if (curl_getinfo($curl, CURLINFO_HTTP_CODE) == '200') {
                //分离头和主体信息
                list($header, $body) = explode("\r\n\r\n", $response, 2);
                if(!empty($response)){
                    //设置图片路径
                    $imgMame=getImgName($imgUrl,$header);
                    
                    $imgSaveName=$imgPath.$imgMame;
                    var_dump($imgSaveName);
                    
                    //保存图片
                    //file_put_contents(dirname($imgSaveName),$body);
                    $fp = fopen ($imgSaveName, 'w');
                    $length = fwrite ($fp, $response);
                    fclose ($fp);
                    //更新数据库
                    $newtext = str_replace($imgUrl, "/usr/uploads/images/".$row['created']."/".$imgMame, $newtext);
                }
            }
            curl_close($curl);
        }
        //$newtext=mysql_escape_string($newtext,$conn);
        $sql3 = "UPDATE `typecho_contents` SET  `text` =  '$newtext' where cid=$row[cid] ";
        $query3 = $conn->query($sql3);

        var_dump($query3);
        echo '<br/>';
    }
}else{
    echo '数据库连接失败';
}
$conn->close();

使用方法

1.新建一个文件将代码复制进去并保存为data.php
2.修改文件中的数据库地址用户名和密码
3.保存文件,网站打开等待自动获取完成
注意:如果数据库表明自定义过请自行更改sql。

标签: 小技巧, Typecho远程图片转本地方法, 原创分享

添加新评论