PHP-上传utf-8文件名
我是越南人,我想上传一个utf-8文件名,比如PHP-上传utf-8文件名,php,file-upload,character-encoding,upload,Php,File Upload,Character Encoding,Upload,我是越南人,我想上传一个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> &
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>
utf-8
但当我上传时,我在我的电脑上看到D:\有一个类似
T \-n Tá»p Tiáºng Viá»T.JPG
如何解决这个问题感谢您(在上传之前)开始检测文件名编码 将文件名插入并检查编码。您可以使用此选项
$fn2 = basename($_FILES['upload']['name']);
此
meta
无效:
因为web服务器已经发送了内容类型
头,因此决定了编码方式。Web浏览器以相同的编码发送表单。meta
在用户离线时非常有用
因此,您必须自己指定http头内容类型
:
<?php header("Content-Type: text/html; charset=utf-8"); ?>
试试这个
$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);
}
我使用的是Windows 8中文版,我遇到了类似的问题:
$filename = iconv("utf-8", "cp936", $filename);
cp
代表code页
和cp936
代表,这是Windows简体中文版的默认代码页
所以我想也许你的问题可以用类似的方式解决:
$fn2 = iconv("UTF-8","cp1258", $base_dir.$fn);
我不太确定您的操作系统的默认代码页是否为1258
,您应该通过打开命令提示符并键入commandchcp
来检查它。然后将1258
更改为命令给您的任何内容。
更新
据介绍,PHP文件系统函数似乎只能处理系统代码页中的字符。因此,您有两种选择:
437
。但我很确定代码页437并没有包含所有的越南语字符1258
并将文件名转换为cp1258
。那么文件系统功能应该可以工作了进入
控制面板
区域
管理
更改系统区域设置
并在下拉菜单中选择越南语(越南)
。对不起!您的问题是关于文件名的
您必须使用iconv保存文件名,但读取时不使用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}')");
?>
到目前为止,我找到的唯一解决方案。。(2014年):
1) 我不会将文件存储在FTP上的UTF-8字符串中。相反,我使用此函数重命名上载的文件:
<?php
// use your custom function.. for example, utf8_encode
$newname = utf8_encode($_FILES["uploadFile"]["name"]);
move_uploaded_file($_FILES["uploadFile"]["tmp_name"], $newname);
?>
2) 现在您可以重命名(或etc)$newname
我是波斯人,我的语言中的utf-8字符也有同样的问题。
我可以用以下代码解决我的问题:
$fn = $_FILES["upload"]["name"]; // name of file have some utf-8 characters
$name=iconv('utf-8','windows-1256', str_replace('ی', 'ي', $fn));
move_uploaded_file($_FILES["upload"]["tmp_name"],$name );
我不确定关于vientam语言,但也许您可以使用与上面相同的代码,但需要做一些更改:
$fn = $_FILES["upload"]["name"]; // name of file have some utf-8 characters
$name=iconv('utf-8','cp936', $fn);
move_uploaded_file($_FILES["upload"]["tmp_name"],$name );
在Windows上,您可能必须使用iconv()将其转换为ucs2@Jack我尝试使用`$fn2=iconv(“UTF-8”、“ucs2”、$base_dir.$fn)`但是获取错误iconv():错误的字符集,不允许从UTF-8'转换到ucs2'?实际上是UCS-2
:)我将其编辑为$fn2=iconv(“UTF-8”,“UCS-2”,$base\u dir.$fn);但是我得到了新的错误move\u upload\u file():文件名不能为空。
和move\u upload\u file():无法移动'E:\PHP\Xampp\tmp\php6B2C.tmp'…
?什么是错,先做什么。您能回显服务器上收到的文件名吗?测试文件名是否以UTF-8编码上传?因为那部分可能会起作用。问题是PHP在编写文件时如何与文件系统交互,这基本上取决于底层文件系统的功能,在Windows环境下,这可能非常难看和复杂。如果文件名在UTF-8中上传得很好,那么问题就变成了“如何在UTF-8中编写文件名”,答案可能不太好。我在文件的第一部分添加了文件(文件是我问题中的代码),但没有任何效果:(@trungkien你在使用什么浏览器?尝试观察网络流量,尤其是在发送表单时,检查发送的(从浏览器发送)内容类型
标题。是否有字符集
?您也可以尝试添加接受字符集=“utf-8”
到
我在使用firefox。如何查看网络流量?我使用firebug,然后进入:Net>All>Headers>Response Headers
在响应头上看到内容类型text/html;charset=utf-8
。我尝试添加接受charset=“utf-8”
但不起作用。这是我的upload.php
文件@trungkien好的,我的意思是请求heders
中的内容类型
,看看那里。在选项中,上传流的请求头中
有内容类型多部分/表单数据;边界=------------------------------------18199138701329
?对不起,我的问题是on是关于在我的计算机上存储utf-8文件名的?+1,因为我认为这个答案是正确的。因为您需要为要使用的字符集选择正确的代码页,这当然很难概括。我尝试给出:活动代码页:437
,我改为$fn2=iconv(“utf-8”,“cp437”,$base_dir.$fn);
并给出类似于的错误通知:iconv():在
中的输入字符串中检测到非法字符,以及一些类似于的警告:移动上传的文件():文件名不能为空
。@trungkien现在我也不知道了。试试cp1258
,可能吧?这样运行看起来比以前更好:(但仍然不是utf-8i跟随将代码页更改为1258
。第一个我只是在HKE中更改
<?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);
}?>
<?php
// use your custom function.. for example, utf8_encode
$newname = utf8_encode($_FILES["uploadFile"]["name"]);
move_uploaded_file($_FILES["uploadFile"]["tmp_name"], $newname);
?>
$fn = $_FILES["upload"]["name"]; // name of file have some utf-8 characters
$name=iconv('utf-8','windows-1256', str_replace('ی', 'ي', $fn));
move_uploaded_file($_FILES["upload"]["tmp_name"],$name );
$fn = $_FILES["upload"]["name"]; // name of file have some utf-8 characters
$name=iconv('utf-8','cp936', $fn);
move_uploaded_file($_FILES["upload"]["tmp_name"],$name );