tags:

views:

75

answers:

4

Dear Gods!

I use this script to upload images to serveR:

 <?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....
    }

?>

This is works well, till i upload a photo with latin chars in filename. For example the filename: kék hegyek.jpg. After upload file name will be: KĂ©k hegyek.jpg

How can i solve this?

Thank you

A: 

This is generally down to the underlying filesystem.

What filesystem do you have underneath this?

Mez
Filesystem : NTFS
Holian
A: 

Your page is in UTF-8 but server in Latin-1. You have to make them the same.

ZZ Coder
How can i check if the server is Latin-1? After upload, i read back the file names and with echo the basename($img), the name is ok. Only on the drive i got this false file name
Holian
Use utf8_decode() on the filename. If you are on Windows, you are likely using ANSI (cp 1252), Latin-1 is 99% compatible.
ZZ Coder
A: 

What kind of a server is this running on? This looks very much like you have a UTF-8 encoded form, but the file name gets changed to latin somewhere along the way - possibly when the file is written to the file system. That's why it's important to know what kind of server / operating system you run this on. I the end, it's down to the file system used.

If your server's filesystem doesn't support UTF-8, you can try to use utf8_decode() or iconv() to convert the name into the right character set.

You can also think about stripping out non-latin characters. That is most often the easiest way, I do that all the time with umlauts.

This is general good reading about encodings: The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)

Pekka
The server is: Wamp 2.0 (Apache 2.2.11; PHP:5.2.9-2; MYSQL:5.1.33). File system NTFS, Op.System XP Prof - Hungarian (contains latin chars support..)
Holian
A: 

I modify the code, as you suggested: This is just a snippet:

   $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, now, after uploading the image, the file name is correct: Kék hegyek.jpg

This part of my code, i read all images from directory and listing them:

  $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>";
     }

This is work well, but the mentioned file-name wrong: K�k hegyek.jpg I tried to use UTF8_DECODE here (the uncommented line), but so the output was: K?hegyek.jpg

After then i tried to use UTF8_ENCODE and voila, the output: Kék hegyek.jpg

But unfortunatelly, the link part of the code wrong, 'coz the link is: http://localhost/page/Kék%20hegyek.jpg.

And the problem is, that i have a button, which i can delete the image.

unlink($filename);

The file name is: Kék hegyek.jpg and not Kék%20hegyek.jpg so i can't delete it.

Im going crazy...

The final solution for me:

  1. In the remote file replace "space" to "_"
  2. Then $remote_file=utf8_decode($remote_file);
  3. When print the filename $img=utf8_encode($img);
  4. And when click to delete: unlink(utf8_decode($_POST['fordelete']));

This solution is work for me. I think not the best way to decode-encode-decode--whaah, but its ok for me.

Holian