PHP-上传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> &

我是越南人,我想上传一个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> 

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
,您应该通过打开命令提示符并键入command
chcp
来检查它。然后将
1258
更改为命令给您的任何内容。

更新

据介绍,PHP文件系统函数似乎只能处理系统代码页中的字符。因此,您有两种选择:

  • 将文件名中的字符限制为系统代码页-在您的情况下,它是
    437
    。但我很确定代码页437并没有包含所有的越南语字符

  • 将系统代码页更改为越南语:
    1258
    并将文件名转换为
    cp1258
    。那么文件系统功能应该可以工作了

  • 这两种选择都有缺陷:

    选择1:你不能再使用越南语字符了,这不是你想要的

    选项2:您必须更改系统代码页,文件名字符限制为代码页1258

    更新

    如何更改系统代码页:


    进入
    控制面板
    区域
    管理
    更改系统区域设置
    并在下拉菜单中选择
    越南语(越南)

    对不起!您的问题是关于文件名的

    您必须使用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 );