文件上传编码问题

diffmaker 2012-05-08 12:08:01
用Flash+PHP实现文件的批量上传。PHP在保存文件时,遇到编码问题:
<?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']),这里的问题?该如何做?
...全文
195 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
改一下昵称 2012-05-08
  • 打赏
  • 举报
回复
GBK编码的字符串没有俄文这些符号。也就是说它只适用于中文
建议你用utf-8来保存,文件名乱码的问题就这么撂着吧
diffmaker 2012-05-08
  • 打赏
  • 举报
回复
Přehled trhu nemovitost - Česká republika 2010 .pdf
PRZEGLĄD RYNKU NIERUCHOMOŚCI - POLSKA - RYNEK BIUROWY - WROCŁAW .pdf

像这两个文件,上传后保存的文件名为:
P
PRZEGL
后面的字符串都丢失了。
diffmaker 2012-05-08
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

你当前页面用了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['……
[/Quote]

使用$uploadfile=$uploaddir.iconv('gbk','utf-8', $_POST['fn']);后,中文文件名就不成了。
flash是用utf-8格式传送数据?
ci1699 2012-05-08
  • 打赏
  • 举报
回复
你当前页面用了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']);
试试
diffmaker 2012-05-08
  • 打赏
  • 举报
回复
我没学过PHP,代码基本上是通过百度得来的。问题简单,莫怪。
diffmaker 2012-05-08
  • 打赏
  • 举报
回复
倒真的没有注意到磁盘格式,哪天找NTFS分区试一下。
diffmaker 2012-05-08
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 的回复:]

咋结贴了呢,我说了一堆没用的,不好意思啊。也许楼主该查查windows文件名编码到底是咋回事。。
[/Quote]

因为文件存储可以通过相应的方法更名绕过去,并不是非解决不可的,没有必要在这里纠结。这里讨教是想看看大家的看法,技术性的。非常感谢!PHP版块挺活跃的,不像Flash版块儿,一天难得见几个人。
foolbirdflyfirst 2012-05-08
  • 打赏
  • 举报
回复
NTFS stores filenames in UTF16, however fopen is using ANSI (not utf8).

stackoverflow上看到的,不知道fat的filename是啥编码。
foolbirdflyfirst 2012-05-08
  • 打赏
  • 举报
回复
咋结贴了呢,我说了一堆没用的,不好意思啊。也许楼主该查查windows文件名编码到底是咋回事。。
foolbirdflyfirst 2012-05-08
  • 打赏
  • 举报
回复
我发现中文windows系统文件名可以copy各种语言进来都没问题,想当然了,抱歉,是可以的。
或许是因为你现在是通过php->web服务器再经windows操作系统保存文件的缘故?我说的文件名跟windows操作系统内码一致纯属主观臆断,是错误的。
diffmaker 2012-05-08
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 的回复:]
你自己在你的windows机上能够输入俄文,阿拉伯文命名一个文件吗?
文件名要视乎客户操作系统的编码,一般国内用户用的都是中文版windows,系统默认内部编码属GBK,GBK怎么可能包含俄文之类的语种呢。或者换过来说你让操作系统编码为iso-8859-1的用户下载你的中文名文件,中文即使给你转成gbk还不一样乱码。干脆就随机命名好了,不然有啥好方法,全世界各地不同的操作系统用户系统编码千差万……
[/Quote]

谢指教。我也想到底层操作系统的原因。这些文件是同事传给我的,不知道什么原因:操作系统不支持这样命名,可是他传给我的文件却可以正常保存?
foolbirdflyfirst 2012-05-08
  • 打赏
  • 举报
回复
你自己在你的windows机上能够输入俄文,阿拉伯文命名一个文件吗?
文件名要视乎客户操作系统的编码,一般国内用户用的都是中文版windows,系统默认内部编码属GBK,GBK怎么可能包含俄文之类的语种呢。或者换过来说你让操作系统编码为iso-8859-1的用户下载你的中文名文件,中文即使给你转成gbk还不一样乱码。干脆就随机命名好了,不然有啥好方法,全世界各地不同的操作系统用户系统编码千差万别,除非所有都统一用utf-8做内码,你这边也不用费劲用iconv转了。
你看我现在用ubuntu,系统编码就是utf-8的,那些中文俄文法文你不转GBK对我这种用户就算正常的,你转GBK倒还乱码了。呵呵。
diffmaker 2012-05-08
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]

你数据源是GBK要怎子搞呢。
iconv用//IGNORE忽略特殊符号转成UTF8、要么就重命名。
[/Quote]

嗯,目前就是重命名的方式。但是想向专业人士请教下有什么有效的方法来解决这个问题。
ci1699 2012-05-08
  • 打赏
  • 举报
回复
你数据源是GBK要怎子搞呢。
iconv用//IGNORE忽略特殊符号转成UTF8、要么就重命名。
diffmaker 2012-05-08
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

GBK编码的字符串没有俄文这些符号。也就是说它只适用于中文
建议你用utf-8来保存,文件名乱码的问题就这么撂着吧
[/Quote]

有没有可能,不指定GBK,而用其他更通用的编码来保存这些文件?
diffmaker 2012-05-08
  • 打赏
  • 举报
回复
我在Flash中,将文件名encodeURI一下,传过来后也是一样的道理。
diffmaker 2012-05-08
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

$uploadfile = $uploaddir . base64_encode($_POST['fn']) . '.' . pathinfo($_POST'fn'], PATHINFO_EXTENSION);
[/Quote]
转成base64编码,肯定是可以保存了,因为相当于对文件进行了重命名。
ci1699 2012-05-08
  • 打赏
  • 举报
回复
你可用//IGNORE参数试试
xuzuning 2012-05-08
  • 打赏
  • 举报
回复
$uploadfile = $uploaddir . base64_encode($_POST['fn']) . '.' . pathinfo($_POST'fn'], PATHINFO_EXTENSION);

21,887

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧