2009-11-26 5 views
0

J'utilise ce script pour télécharger des images sur le serveur:Image upload - Latin carbonise problème

<?php 

if (($_FILES["image_upload_box"]["type"] == "image/jpeg" || $_FILES["image_upload_box"]["type"] == "image/pjpeg" && ($_FILES["image_upload_box"]["size"] < 2000000)) 
    { 

     $max_upload_width = 450; 
     $max_upload_height = 450; 
     if(isset($_REQUEST['max_width_box']) and $_REQUEST['max_width_box']!='' and $_REQUEST['max_width_box']<=$max_upload_width){ 
      $max_upload_width = $_REQUEST['max_width_box']; 
     }  
     if(isset($_REQUEST['max_height_box']) and $_REQUEST['max_height_box']!='' and $_REQUEST['max_height_box']<=$max_upload_height){ 
      $max_upload_height = $_REQUEST['max_height_box']; 
     } 
     if($_FILES["image_upload_box"]["type"] == "image/jpeg" || $_FILES["image_upload_box"]["type"] == "image/pjpeg"){  
      $image_source = imagecreatefromjpeg($_FILES["image_upload_box"]["tmp_name"]); 
     }  

     $remote_file =$directory."/".$_FILES["image_upload_box"]["name"]; 
     imagejpeg($image_source,$remote_file,100); 
     chmod($remote_file,0644); 

     list($image_width, $image_height) = getimagesize($remote_file); 

     if($image_width>$max_upload_width || $image_height >$max_upload_height){ 
      $proportions = $image_width/$image_height; 

      if($image_width>$image_height){ 
       $new_width = $max_upload_width; 
       $new_height = round($max_upload_width/$proportions); 
      }  
      else{ 
       $new_height = $max_upload_height; 
       $new_width = round($max_upload_height*$proportions); 
      }  


      $new_image = imagecreatetruecolor($new_width , $new_height); 
      $image_source = imagecreatefromjpeg($remote_file); 

      imagecopyresampled($new_image, $image_source, 0, 0, 0, 0, $new_width, $new_height, $image_width, $image_height); 
      imagejpeg($new_image,$remote_file,100); 

      imagedestroy($new_image); 
     } 

     imagedestroy($image_source); 



    }else{ 
     something.... 
    } 

?> 

C'est fonctionne bien, jusqu'à ce que je télécharger une photo avec les caractères latins dans le nom de fichier. Par exemple le nom de fichier: kék hegyek.jpg. Après le téléchargement, le nom du fichier sera: KĂ © k hegyek.jpg

Comment puis-je résoudre ce problème?

Merci

+0

Quelle version de PHP utilisez-vous? – Mez

+0

Content de voir qu'au moins * quelqu'un * sait comment nous adresser correctement. :) –

+0

Version Php: 5.2.9-2 – Holian

Répondre

0

Ceci est généralement lié au système de fichiers sous-jacent.

De quel système de fichiers disposez-vous?

+0

Système de fichiers: NTFS – Holian

0

Votre page est en UTF-8 mais le serveur est en Latin-1. Vous devez les faire pareil.

+0

Comment puis-je vérifier si le serveur est Latin-1? Après le téléchargement, je relis les noms de fichiers et avec echo le nom de base ($ img), le nom est ok. Seulement sur le lecteur j'ai obtenu ce faux nom de fichier – Holian

+0

Utilisez utf8_decode() sur le nom de fichier. Si vous utilisez Windows, vous utilisez probablement ANSI (cp 1252), Latin-1 est compatible à 99%. –

0

De quel type de serveur s'agit-il? Cela ressemble beaucoup à une forme encodée en UTF-8, mais le nom du fichier est changé en latin quelque part en cours de route - éventuellement lorsque le fichier est écrit dans le système de fichiers. C'est pourquoi il est important de savoir quel type de serveur/système d'exploitation vous utilisez. A la fin, c'est au système de fichiers utilisé.

Si le système de fichiers de votre serveur ne prend pas en charge UTF-8, vous pouvez essayer d'utiliser utf8_decode() ou iconv() pour convertir le nom dans le bon jeu de caractères.

Vous pouvez également supprimer les caractères non latins. C'est le plus souvent le moyen le plus simple, je le fais tout le temps avec les trémas.

C'est une bonne lecture générale sur encodages: The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)

+0

Le serveur est: Wamp 2.0 (Apache 2.2.11, PHP: 5.2.9-2, MYSQL: 5.1.33). Système de fichiers NTFS, Op.System XP Prof - Hongrois (contient le support des caractères latins ..) – Holian

0

Je modifie le code, comme vous le suggérez: Ceci est juste un extrait:

$remote_file =$directory."/".$_FILES["image_upload_box"]["name"]; 
    $remote_file=utf8_decode($remote_file); 
    imagejpeg($image_source,$remote_file,100); 
    chmod($remote_file,0644); 

Ok, maintenant, après avoir téléchargé l'image, le nom de fichier est correct: Kék hegyek.jpg

Cette partie de mon code, j'ai lu toutes les images du répertoire et les énumérant:

$images = glob("" . $directory . "*"); 
    $imgs = ''; 
    foreach($images as $image){ $imgs[] = "$image"; } 
    $imgs = array_slice($imgs, 0, 20); 
    foreach ($imgs as $img) { 
    // $img=utf8_decode($img); 
    echo "<form action='datasheet_edit.php' id='$img' method='post'>"; 
    echo "<div class=\"photo\">"; 
    echo "<img src='$img' width='100' height='50%' alt=\"\"><br>\n"; 
    echo "<a href=\"$img\">",basename($img),"</a><br>\n</div>"; 
    echo "<input type='hidden' id='fordelete' name='fordelete' value='$img' />"; 
    echo "</div>\n"; 
    echo "</form>"; 
    } 

Ce travail est bien, mais le mauvais fichier mentionné nom: Kk hegyek.jpg j'ai essayé d'utiliser utf8_decode ici (la ligne décommentée), mais si la sortie était: K hegyek.jpg

?

Après j'essayé d'utiliser utf8_encode et le tour est joué, la sortie: Kék hegyek.jpg

Mais unfortunatelly, la partie de lien du code erroné, « coz le lien est: http://localhost/page/Kék%20hegyek.jpg.

Et le problème est, que j'ai un bouton, que je peux supprimer l'image.

unlink ($ filename);

Le nom de fichier est: Kék hegyek.jpg et non Kék% 20hegyek.jpg donc je ne peux pas le supprimer.

Je deviens fou ...

La solution finale pour moi:

  1. Dans le fichier distant, remplacez "espace" à "_"
  2. Alors $ remote_file = utf8_decode (remote_file $);
  3. Lors de l'impression du nom de fichier $ img = utf8_encode ($ img);
  4. Et lorsque vous cliquez pour supprimer: unlink (utf8_decode ($ _ POST ['fordelete']));

Cette solution fonctionne pour moi. Je ne pense pas que la meilleure façon de décoder-encoder-décoder - whaah, mais c'est ok pour moi.