2009-11-26 63 views
0

我使用這個腳本上傳圖片到服務器:圖片上傳 - 拉丁字符問題

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

?> 

這是效果很好,直到我上載與文件名字符拉丁文中的照片。 例如文件名:kékhegyek.jpg。上傳文件名後將是:KĂ©k hegyek.jpg

我該如何解決這個問題?

謝謝

+0

您使用的是什麼版本的PHP? – Mez 2009-11-26 14:21:14

+0

很高興看到至少*某人*知道如何正確解決我們的問題。 :) – 2009-11-26 14:26:08

+0

Php版本:5.2.9-2 – Holian 2009-11-26 14:33:55

回答

0

這通常是下面的底層文件系統。

你下面有什麼文件系統?

+0

Filesystem:NTFS – Holian 2009-11-26 14:35:53

0

您的頁面採用UTF-8格式,但服務器採用Latin-1格式。你必須讓他們一樣。

+0

如何檢查服務器是否爲Latin-1?上傳後,我讀迴文​​件名和echo基名($ img),名字是好的。只有在驅動器上我得到這個假文件名 – Holian 2009-11-26 14:39:06

+0

在文件名上使用utf8_decode()。如果你在Windows上,你可能使用ANSI(cp 1252),Latin-1是99%兼容的。 – 2009-11-26 14:51:56

0

這是在運行什麼樣的服務器?這看起來很像你有一個UTF-8編碼形式,但文件名被改爲拉丁文的某處 - 可能是文件寫入文件系統時。這就是爲什麼知道你在哪種服務器/操作系統上運行這一點很重要。最後,這取決於所使用的文件系統。

如果您的服務器的文件系統不支持UTF-8,則可以嘗試使用utf8_decode()iconv()將名稱轉換爲正確的字符集。

你也可以考慮剝離非拉丁字符。這通常是最簡單的方法,我總是用變音符號來完成。

這是關於編碼總體上是好的閱讀: The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)

+0

服務器是:Wamp 2.0(Apache 2.2.11; PHP:5.2.9-2; MYSQL:5.1.33)。文件系統NTFS,Op.System XP教授 - 匈牙利語(包含拉丁字符支持..) – Holian 2009-11-26 14:44:43

0

我修改代碼,如你所說: 這只是一個片段:

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

好了,現在,上傳圖片後,文件名是正確的:Kékhegyek.jpg

這部分我的代碼,我從目錄中讀取所有圖像並列出它們:

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

這是很好的工作,但上述文件名錯誤:KK hegyek.jpg 我試圖用UTF8_DECODE這裏(的註釋行), 但這樣的產量爲:K hegyek.jpg

然後後,我試圖用函數utf8_encode,瞧,輸出:KEK hegyek.jpg

但可惜的是,代碼錯誤的鏈接部分,「怎麼該鏈接是:http://localhost/page/Kék%20hegyek.jpg

問題是,我有一個按鈕,我可以刪除圖像。

unlink($ filename);

文件名是:Kékhegyek.jpg而不是Kék%20hegyek.jpg所以我不能刪除它。

我要瘋了...

對我來說,最終的解決方案:

  1. 在遠程文件替換的 「空間」,以 「_」
  2. 然後$ remote_file = utf8_decode(remote_file $);
  3. 當打印文件名$ img = utf8_encode($ img);
  4. 當點擊刪除:unlink(utf8_decode($ _ POST ['fordelete']));

此解決方案適用於我。我認爲不是解碼 - 編碼 - 解碼的最佳方式 - whaah,但它對我來說可以。