//发现 WLW 上传的图片丢失了内部 EXIF 信息,那么这个程序.......囧。本来都做到把图片信息插入到数据库这了,结果看来是白费力啊哈哈哈。

//这样 WLW 还是只能够做一个纯文字的替代了...

希望能如标题写得这样...

Windows live writer 是一个非常优秀的离线博客撰写工具,继承了 office 的界面和强大的功能,对于一款离线博客撰写软件来说,已经堪称完美。Windows live writer 在撰写博客的过程中插入图片可以说是享受,不仅可以自定义上传图片的大小,还可以自定图片的显示效果,对于懒人来说只要把图片拖进窗口,调好位置,剩下的都不用自己操心了。Nextgen Gallery 则是 WordPress 中一个非常优秀的插件,提供了强大的图片管理功能和非常酷炫的播放效果(当然很多效果你需要安装这个插件的插件才能实现。)

然而两个完美的事情碰到一起却并不总是那么完美,首先是 Windows live writer 默认的上传图片方式为 POST 上传,这种上传方式利用的是 WordPress 自带的媒体库管理的,优点是比较简单,缺点也是最让我不能忍受的是这样上传的图片一张将会占用一个 post_id,也就是说如果当前文章的序号是1的话,那么你上传两张图片之后再写第二篇文章的序号将会变成4,这对于喜欢连贯的我来说绝对不能采用的。不过 WLW 还提供了另外一种方式,就是直接将图片通过 FTP 上传到自定义目录,然后再在文章中用 HTML 语法插入图片 img src,但是这种方式也有一个非常大的缺点,就是 WLW 会自作主张的在你设置的目录下创建一个以文章名加随机值的文件夹,再在其中放入图片及它的缩略图文件。其实这样倒也没什么,但是对于希望用 Nextgen Gallery管理相册的人来说,这又是个大麻烦:NGG 不支持子目录,也就是说即使你把 WLW 的上传目录和 NGG 设成一样的,也会因为 WLW 的自作主张和 NGG 的六亲不认导致图片只能过单亲生活! 既然 WordPress,NGG,WLW 的插件们都没有解决这个问题的办法,那么只有自己动手丰衣足食了。

思路就是: 将 WLW 自作主张建立的子目录中的文件转移到上一层目录,但是由于此目录中还有一个缩略图文件 XXXXXX_thumb.jpg,所以必须要忽略这个文件;同样的,NGG 会在其默认目录下建立两个文件夹,一个 thumbs 来存放小缩略图,一个 cache 来存放文章中引用的较大预览图,那么必然不能将这两个目录的文件转移到上层,要忽略这两个文件夹。在转移完之后要把没用的文件和文件夹删除掉,在转移过程中防止同名文件还要加入判断文件名并重命名的程序。基本思路就是这样,其实实现起来并不难,主要是我是 code 的门外汉啊,只能慢慢来了。

<?php
//!!!!必须填写
$basedir = "/home/neverwee/public_html/img/default";//!!!!定义Nextgen Gallery图集的上传路径
//!!!!必须填写
//寻找符合需求的文件并将其移动到上层目录
function searchfile($dir)
{$handler=opendir($dir);
	while( ($filename = readdir($handler)) !== false ) //遍历子目录下的所有文件
	{if($filename != '.' && $filename != '..') //忽略文件名为’.'和‘..’的文件
		{if(strpos($filename,"_thumb") > 0) //忽略文件名中含有 _thumb 的文件
			{}
			else{
				if (file_exists("$filename")) //判断上层目录是否已有同名文件
				{rename("$dir"."/".$filename, "newer_".$filename);//有则在文件名前加"newer_"后再移动
					echo "$filename already exists, $filename has moved to parent dir and renamed newer_$filename<br>";
				}
				else{
					//rename("$dir"."/".$filename, $filename);//没有则直接移动
					sql($filename);
					echo "$filename has moved to parent dir. <br>";
				}
			}
		}
	}
	closedir($handler);
}
//删除 WLW 生成的目录和文件
function deldir($dir)
{$dh=opendir($dir);
	while ($file=readdir($dh))
	{if($file!="." && $file!="..")
		{$fullpath=$dir."/".$file;
			if(!is_dir($fullpath))
			{unlink($fullpath);//删除文件
			}
			else{
				deldir($fullpath);//删除目录
				echo "//dir $fullpath has been deleted. <br>";
			}
		}
	}
	closedir($dh);
	if(rmdir($dir))
	{return true;
	}
	else {return false;}
}
//主程序
if ($dh = opendir($basedir))
{while (($file = readdir($dh)) !== false)
	{if ($file != '.' && $file != '..')
		{if (is_dir($basedir."/".$file))
			{if ($file=="cache" || $file=="thumbs") {//判断当前目录名是否是 cache 或 thumbs,如不是则继续
				}
				else{
					echo "<br>OPERATING DIRNAME: $basedir/$file <br><br>";
					$dir = "$basedir"."/"."$file";
					searchfile($dir);//寻找符合需求的文件并将其移动到上层目录
					//deldir($dir);//删除 WLW 生成的目录和文件
				}
			}
		}
	}
	closedir($dh);
}
echo "<br>All done!";//结束
?>

进一步的想法:
1.将转移好的图片的信息直接写入到 MySQL 数据库相应的表中,这样就可以直接在 NGG 中引用了。基本的将文件基本信息写入数据库的程序已经写好了(没敢测试,没有找到支持 phpmyadmin 的免费空间来做测试,又不想在本机装太多的服务器软件),但是对于照片 EXIF 信息的格式还是完全不解,这个只能靠看 NGG 的源码找出来了,到以上可以通过重建缩略图来生成新加入文件的 thumbnalis,不过如果能直接找到自动生成的代码就更好了。
2.直接寻找最新文章的内容,凡是在<img> </img>中包含图片文件名例如 XXXX.jpg 的内容,全部替换成符合 NGG 格式的函数+图片 ID。我估计这种替换还需要用到正则表达式,不过应该不会应用到太难,还没有仔细研究图片引用的格式。

这就是一个菜鸟的 PHP 程序 alpha 0.0001

  1. 恩,又是一篇好文。Live Writer 和 Nextgen 我都在用,不能结合确实不方便。下周有时间我要研究下你这篇博客介绍的技巧。

    • @Jes
      Hi,小虾,鉴于你在 Ren 命令和博客中表现的伟大智慧,偶又跑过来问路了,以后你的被问路率就上涨到 37% 了。 :razz:
      我有一个虚拟空间,绑定了主域名 A,还绑定了附加域名 B,我用 wordpress 为 B 搭建了网站,存放在 B 所对应的根目录下——注意不是绝对根目录,而是相对根目录。现在我想搭建 A 了,遇到问题了,难道我还要架设一次 wordpress?能不能用一个 位于相对根目录 的 WordPress 系统直接管理两个网站呢?当然这两个网站主题、风格、内容、图片管理、插件系统等都完全独立。

    • @Jes
      这是个失败品,我早就不用 WLW 了,现在直接在 WP 里面写了...

    • @Jes
      :appall: 好像不行吧,好像 WordPress 本身没有管理多用户的功能,不过 WordPress MU 可以(但是管理两个不在同一目录层次的内容估计不可能,再加上两个域名的情况就更复杂了),但我没用过,建议你找找这方面的资料。