Typecho远程图片转本地方法
前言
这次分享一个文件,可以直接把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。