文件上传编码问题
用Flash+PHP实现文件的批量上传。PHP在保存文件时,遇到编码问题:
PHP code1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | <!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http:
--><?php header( "Content-Type:text/html;charset=utf-8" );
function createDir( $path ){
if (! file_exists ( $path )){
createDir(dirname( $path ));
mkdir ( $path , 0777);
}
}
$uploaddir = 'upfile/' . date ( 'Ymd' ). '/' ;
createDir( $uploaddir );
$uploadfile = $uploaddir .iconv( 'utf-8' , 'gbk' , $_POST [ 'fn' ]);
if (move_uploaded_file( $_FILES [ 'Filedata' ][ 'tmp_name' ], $uploadfile )) {
echo 'OK' . $_POST [ 'bn' ]. '{[(*})]' . $_POST [ 'up' ]. '{[(*})]' . '$uploadjson' . '{[(*})]' . '$listjson' ;
} else {
echo 'ERROR' ;
}
?>
|
登录后复制
文件名很不规范,有中文、英文、法文、俄文、……不确定类型,这时候有些文件保存下来,要么是乱码,要么被截断(扩展名都丢失了)。iconv('utf-8','gbk',$_POST['fn']),这里的问题?该如何做?
------解决方案--------------------
你当前页面用了utf-8
header("Content-Type:text/html;charset=utf-8");
而这个应不该转成gbk
$uploadfile=$uploaddir.iconv('utf-8','gbk',$_POST['fn']);
去掉或是
$uploadfile=$uploaddir.iconv('gbk','utf-8', $_POST['fn']);
试试
------解决方案--------------------
GBK编码的字符串没有俄文这些符号。也就是说它只适用于中文
建议你用utf-8来保存,文件名乱码的问题就这么撂着吧
------解决方案--------------------
$uploadfile = $uploaddir . base64_encode($_POST['fn']) . '.' . pathinfo($_POST'fn'], PATHINFO_EXTENSION);
------解决方案--------------------
你数据源是GBK要怎子搞呢。
iconv用//IGNORE忽略特殊符号转成UTF8、要么就重命名。
------解决方案--------------------
你自己在你的windows机上能够输入俄文,阿拉伯文命名一个文件吗?
文件名要视乎客户操作系统的编码,一般国内用户用的都是中文版windows,系统默认内部编码属GBK,GBK怎么可能包含俄文之类的语种呢。或者换过来说你让操作系统编码为iso-8859-1的用户下载你的中文名文件,中文即使给你转成gbk还不一样乱码。干脆就随机命名好了,不然有啥好方法,全世界各地不同的操作系统用户系统编码千差万别,除非所有都统一用utf-8做内码,你这边也不用费劲用iconv转了。
你看我现在用ubuntu,系统编码就是utf-8的,那些中文俄文法文你不转GBK对我这种用户就算正常的,你转GBK倒还乱码了。呵呵。