Total Pageviews

Tuesday, 19 March 2013

WP上传出现IO错误

在WP中,上传文件时,遇上IO Error 即Input/Output 错误.

经过进一步的测试。我得到了如下结果:用Firefox、Chrome、Opera、IE9浏览器Flash上传工具上传/插入文件时,进度条为0%,等待1-2秒出现IO error错误,无正常上传后图片各项属性编辑,媒体库没有相应文件加入。而普通HTTP上传方式,图片会正确上传到文件夹能够返回图片的编辑项,媒体库有更新。

我检查了我博客整体文件,用比较工具,和我备份的文件进行了比对,无任何变化。参考:How to fix IO Error when Uploading Images in WordPress- http://techravings.info/2009/06/how-to-fix-io-error-when-uploading-images-in-wordpress.html

结合着我再网上查找的资料,我发现早在WordPress2.5版本时,出现过因Adobe Flash Player ActiveX版本问题而造成的 IO error. An error occurred in the upload. Please try again later。

由于多年的计算机使用习惯,有新版本就更新的毛病,可能是我把Adobe Flash Player更新到了最新版本。或许因Firefox的关闭,使更新生效了。而服务器应用程序池的回收,是否促进了更新的生效,这里不确定。但综合而言,这些变化造成了我的IO error!

在隔壁房间的电脑里找到一台安装了Adobe Flash Player 10.1.85.3的机器,测试上传插入图片成功后,更加确认了我分析的正确。于是我找到了安装目录:C:\WINDOWS\system32\Macromed\Flash,把相应的文件复制到自己的机器进行覆盖后,问题解决。


总结一下IO error、无法上传/插入文件解决办法

1、卸载你本地的Flash Player
2、找到Adobe Flash Player 10.0.45.2版本,安装更新。或复制Adobe Flash Player 10.0.45.2文件,本地覆盖。

关于上传无法显示的问题

今天发现主题自带的媒体缩略图功能失常,后台查看发现是上传的图片不能正常显示,但是使用图片地址却能够访问到,在媒体库编辑图片状态也依然可以显示.

首先我先确保了 wp-content/uploads 文件777权限

再次尝试发现并非权限问题.后来根据以往架设Discuz论坛的经验.我推测是以下几种原因:

1、WP处理UNICODE字符的相关函数存在缺陷
从反馈的结果看,WP是可以将汉字转换成UNICODE字符的,但是转换正确与否,尚未验证。
2、操作系统本身 的问题
本屋服务器操作系统系Debian GNU/Linux 4.0。众所周知,unix系统是ASCII编码的天下,一向对汉字这样的“双字节”符号支持不完善。
3、Apache HTTP Server 的问题
本屋的HTTP 服务软件系Apache 2.2。GOOLGE到的信息告诉我:Apache2在linux下有支持中文URL的缺陷。

PS. 根据APACHE 的日志文件显示,中文文件名图片会产生 HTTP 404错误,看来真的是APACHE的问题。
目前网上提供的解决方案有:
a. 增加 AddDefaultCharset GB2312 —— 经测试无效,这个只影响页面输出的缺省编码,但是页面应该是自己指定编码的,由Server指定不符合逻辑,尤其存在Virtual Server的情况下;

b. 取消IE始终使用UTF-8传送URL —— 经测试有效,但是又不能强迫所有客户端修改IE配置,而且是IE的缺省配置
问题原因:
a. 文件上传时,apache的上传模块传递的文件名是不经过编码的,即使用ISO8859-1编码,并以此编码的文件名保存之;
b. 如果由apache自己生成该文件的URL,则中文文件名是经过urlencode处理过的,此时下载正常,但是在弹出对话框的保存文件名中中文出现乱码;
c. 如果由程序用此中文名直接生成URL,由于IE使用UTF-8传递URL,因此中文会首先被转成UTF-8,然后经urlencode处理;Apache受到后还原为UTF-8的文件名,无法找到用ISO8859-1编码的对应的文件;
解决方法:
a. 文件上传后保存时一般由cgi完成处理,因此在此时保存为UTF-8编码的文件名;例如在php中采用:

copy($tmpFile, iconv(”gb2312″, “utf-8″, $FileName));

前提是php支持iconv;
b. 生成URL时,也采用此种方法,用iconv转码后再urlencode;
c. Apache2无法支持空格的urlencode结果“+”,要替换成“%20”
以上步骤a、b、c必须同时存在,或者只采取步骤a也可,取消b、c,直接用中文做URL,由IE做转码和urlencode,此时空格不会翻译成“+” (why?)
结果
1. 中文文件名的文件正常下载;
2. 保存文件的对话框显示正确;
缺点
在linux上保存的文件名是UTF-8的,在没有设定系统是此种编码时,显示为乱码。

如果想要简单解决此问题只需在上传之前将文件重命名为英文即可.