PHP – 上传utf-8文件名
我是越南人,我想上传一个utf-8文件名
Tên Tệp Tiếng Việt.JPG
这是我的代码
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>utf-8</title> </head> <body> <?php if(isset($_POST["submit"])) { if($_FILES["upload"]["error"] > 0 ) echo "FILE ERROR!"; else { $base_dir = "D:/"; $fn = $_FILES["upload"]["name"]; $fn2 = $base_dir.$fn; move_uploaded_file($_FILES["upload"]["tmp_name"],$fn2); } } ?> <form action="" method="post" enctype="multipart/form-data" name="form1" id="form1"> <input type="file" name="upload" id="upload" /> <input type="submit" name="submit" id="submit" value="Send" /> </form> </body> </html>
但是当我上传,我在我的电脑上看到D:\有一个像
Tên Tệp Tiếng Việt.JPG
如何解决这个谢谢
我在Windows 8中文版,我处理类似的问题:
$filename = iconv("utf-8", "cp936", $filename);
cp
代表Code page
, cp936
代表代码页936 ,是简体中文版Windows的默认代码页。
所以我想也许你的问题可以用类似的方式解决:
$fn2 = iconv("UTF-8","cp1258", $base_dir.$fn);
我不太确定您的操作系统的默认代码页是否是1258
,您应该打开命令提示符并键入命令chcp
来检查它自己。 然后改变1258
到任何命令给你。
UPDATE
看来,PHP文件系统function只能处理系统代码页中的字符,根据这个答案 。 所以你有两个select:
-
将文件名中的字符限制为系统代码页 – 在你的情况下,它是
437
。 但是我敢肯定,代码页437不包括所有的越南字符。 -
将您的系统代码页更改为
cp1258
:1258
并将文件名转换为cp1258
。 然后文件系统function应该工作。
两种select都是不足的:
select1:你不能使用越南的字符,这不是你想要的。
select2:您必须更改系统代码页,并且文件名字符仅限于代码页1258。
UPDATE
如何更改系统代码页:
转到Control Panel
> Region
> Administrative
> Change system locale
然后在下拉菜单中selectVietnamese(Vietnam)
。
这个meta
不起作用:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
因为Web服务器已经发送了Content-Type
头,因此决定了编码是什么。 Web浏览器以相同的编码发送表单。 当用户离线时, meta
是有用的。
所以你必须自己sned http头Content-Type
:
<?php header("Content-Type: text/html; charset=utf-8"); ?>
确保你在任何HTML,内容或任何被发送之前把这个。
或者, form
上的accept-charset
标签应该像weel一样工作:
<form accept-charset="utf-8">
迄今为止唯一的解决scheme ..(2014年):
1)我不把文件存储在我的FTP UTF-8string 。 相反,我使用这个function来重命名上传的文件:
<?php // use your custom function.. for example, utf8_encode $newname = utf8_encode($_FILES["uploadFile"]["name"]); move_uploaded_file($_FILES["uploadFile"]["tmp_name"], $newname); ?>
2)现在你可以重命名(或者等) $newname
;
开始获取检测文件名编码(在上传之前)。
print_r($_FILES["upload"]);
将文件名插入解码器并检查编码。
抱歉! 你的问题是关于文件名。
你必须用iconv保存你的文件名,但是没有这个可以读取。
为了节省:
<?php $name = $_FILES['photo']['name']; $unicode = iconv('windows-1256', 'utf-8', $name); move_uploaded_file($_FILES['photo']['tmp_name'], 'photos/' . $name); mysql_query("INSERT INTO `photos` (`filename`) VALUES ('{$unicode}')"); ?>
阅读:
<?php $images = mysql_query('SELECT * FROM `photos`'); if($images && mysql_num_rows($images) > 0) { while($image = mysql_fetch_assoc($images)) { $name = iconv('utf-8', 'windows-1256', $image['filename']); echo '<img src="photos/' . $name . '"/>'; } mysql_free_result($images); }?>
尝试这个
$imgname = $_FILES['img'] ['name'] ; $imgsize = $_FILES['img'] ['size'] ; $imgtmpname = $_FILES['img'] ['tmp_name'] ; $imgtype = $_FILES['img'] ['type'] ; $size = 1024; $imgtypes = array('image/jpeg','image/gif','image/png'); $folder = "up"; if(empty($imgname)){ echo "Shose ur photo"; }else if(!in_array($imgtype,$imgtypes)){ echo "this photo type is not avalable"; }else if($imgsize > $size){ echo "this photo is dig than 6 MB"; }else if($imgwidth > 5000){ echo "the file is to big"; } else{ move_uploaded_file($imgtmpname, $folder, $filename); }
function convToUtf8($str) { if( mb_detect_encoding($str,"UTF-8, ISO-8859-1, GBK")!="UTF-8" ) { return iconv("gbk","utf-8",$str); } else { return $str; } } $filename= convToUtf8($filename) ;
你可以使用这个
$fn2 = basename($_FILES['upload']['name']);