PHP-Upload utf-8 Nom du fichier
Je suis Vietnamien et je veux télécharger un nom de fichier utf-8 comme
Tên Tệp Tiếng Việt.JPG
Voici mon code
<!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>
, Mais quand je télécharge ce que je vois sur mon ordinateur D: a un fichier comme
Tên Tệp Tiếng Việt.JPG
Comment réparer cela merci
9 réponses
Je suis sur Windows 8 version chinoise, et je fais face à un problème similaire avec ceci:
$filename = iconv("utf-8", "cp936", $filename);
cp
Code page
et cp936
Code page 936, qui est la page de code par défaut de la version chinoise simplifiée de Windows.
Donc, je pense que peut-être votre problème pourrait être résolu de la même manière:
$fn2 = iconv("UTF-8","cp1258", $base_dir.$fn);
Je ne suis pas tout à fait sûr si la page de code par défaut de votre système d'exploitation est 1258
ou non, vous devriez le vérifier vous-même en ouvrant l'invite de commande et entrez la commande chcp
. Ensuite, changez 1258
en ce que la commande vous donne.
Mise à JOUR
Il semble que les fonctions du système de fichiers PHP ne peuvent gérer que les caractères qui sont dans la page de code du système, selon cette réponse . Vous avez donc 2 choix ici:
Limitez les caractères dans le nom de fichier à la page de code système - dans votre cas, c'est
437
. Mais je suis sûr que la page de code 437 ne comprend pas tous les Vietnamiens caractère.Changez votre page de code système pour la page vietnamienne:
1258
et convertissez le nom de fichier encp1258
. Ensuite, les fonctions du système de fichiers devraient fonctionner.
Les deux choix sont déficients:
Choix 1: vous ne pouvez plus utiliser de caractères vietnamiens, ce qui n'est pas ce que vous voulez.
Choix 2: vous devez changer la page de code système, et les caractères du nom de fichier sont limités à la page de code 1258.
Mise à JOUR
Comment changer page de code du système:
Aller à Control Panel
> Region
> Administrative
> Change system locale
et sélectionnez Vietnamese(Vietnam)
dans le menu déroulant.
Ce meta
n'a aucun effet:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
Parce que le serveur web a déjà envoyé l'en-tête Content-Type
, et a donc décidé quel sera le codage. Les navigateurs Web envoient des formulaires dans le même encodage. Le meta
est utile lorsque l'utilisateur est hors-ligne.
Vous devez donc sned http header Content-Type
par vous-même:
<?php header("Content-Type: text/html; charset=utf-8"); ?>
Assurez-vous que vous mettez cela avant tout html, contenu ou tout ce qui est envoyé.
Sinon, accept-charset
balise form
devrait fonctionner ainsi:
<form accept-charset="utf-8">
La seule solution j'ai trouvé jusqu'à présent.. (2014 année):
1) Je ne stocke pas de fichiers sur mon FTP dans UTF-8 string . Au lieu de cela, j'utilise cette fonction, pour renommer les fichiers téléchargés:
<?php
// use your custom function.. for example, utf8_encode
$newname = utf8_encode($_FILES["uploadFile"]["name"]);
move_uploaded_file($_FILES["uploadFile"]["tmp_name"], $newname);
?>
2) Maintenant, vous pouvez renommer (ou etc) $newname
;
Je suis persan et j'ai le même problème avec le caractère utf-8 dans ma langue. Je pourrais résoudre mon problème avec ce code:
$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 );
Je ne suis pas sûr de la langue vientam mais peut-être que vous pouvez utiliser le même code que ci-dessus avec quelques modifications:
$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 );
Désolé! votre question concerne le nom de fichier.
Vous devez enregistrer votre nom de fichier avec iconv mais lire sans cela.
Pour enregistrer:
<?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}')");
?>
Pour lire:
<?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);
}?>
Essayez ceci
$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) ;
Vous pouvez utiliser ceci
$fn2 = basename($_FILES['upload']['name']);