我使用此脚本将图像上传到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
我该如何解决这个问题?
谢谢
答案 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所以我无法删除它。
我疯了......
我的最终解决方案:
这个解决方案对我有用。我认为不是解码编码解码的最好方法 - whaah,但它对我来说没问题。