图片上传 - 拉丁字符问题

时间:2009-11-26 14:18:18

标签: php

我使用此脚本将图像上传到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....
    }

?>

这很有效,直到我上传带有拉丁字符的照片在文件名中。 例如文件名:kékhegyek.jpg。上传文件名后将是:KĂ©k hegyek.jpg

我该如何解决这个问题?

谢谢

4 个答案:

答案 0 :(得分:0)

这通常归结为底层文件系统。

你在这下面有什么文件系统?

答案 1 :(得分:0)

您的网页是UTF-8,但服务器是Latin-1。你必须使它们一样。

答案 2 :(得分: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!)

答案 3 :(得分: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>";
     }

这很好用,但提到的文件名错了:K khegyek.jpg 我试着在这里使用UTF8_DECODE(未注释的行), 但所以输出是:K?hegyek.jpg

之后我尝试使用UTF8_ENCODE和voila,输出:Kékhegyek.jpg

但不幸的是,代码的链接部分错了,'因为链接是:http://localhost/page/Kék%20hegyek.jpg

问题是,我有一个按钮,我可以删除图像。

的unlink($文件名);

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

我疯了......

我的最终解决方案:

  1. 在远程文件中将“space”替换为“_”
  2. 然后$ remote_file = utf8_decode($ remote_file);
  3. 打印文件名时$ img = utf8_encode($ img);
  4. 点击删除时:取消链接(utf8_decode($ _ POST ['fordelete']));
  5. 这个解决方案对我有用。我认为不是解码编码解码的最好方法 - whaah,但它对我来说没问题。