javascript - PHP 对重音符号和特殊字符进行编码

标签 javascript php jquery

我的 php 上传图像有一点问题。

我正在制作一个网站,用户可以在其中查看显示的图像的预览,但如果图像包含重音符号就会出错,例如“Nenúfares.jpg”会变成“Nenúfares.jpg.jpg”

我该如何解决这个问题?

考虑过在警报出现时添加一些方法来选择。(JS)包含特殊字符,例如重音符号等......

小米代码

PHP:

$allowedExts = array("gif", "jpeg", "jpg", "png");
$temp = explode(".", $_FILES["file"]["name"]);
$extension = end($temp);

if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/jpg")
|| ($_FILES["file"]["type"] == "image/pjpeg")
|| ($_FILES["file"]["type"] == "image/x-png")
|| ($_FILES["file"]["type"] == "image/png"))
&& ($_FILES["file"]["size"] < 20000000)
&& in_array($extension, $allowedExts))
{
$ruta ="tmp/".$_FILES["file"]["name"];
  $rutafinal =str_replace(" ","_",$ruta); //Change " " for "_"
  move_uploaded_file($_FILES["file"]["tmp_name"],$rutafinal);
  echo $rutafinal;


  }
else
  {
     echo "Archivo no valido";
  } 

JavaScript(AJAX):

function previewIMG() {
    var formData = new FormData();
    var file = $("#fileselectInput")[0].files[0];

    formData.append("file", file);
    formData.append("name", file.name);
    var url ="subir_img_producto.php";
    if (window.XMLHttpRequest){
        xmlhttp=new XMLHttpRequest();
    }else{
        xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
    }

    var http = new XMLHttpRequest();
    http.open("POST", url, true);        
    http.send(formData);

    http.onreadystatechange = function() {
        if(http.readyState == 4 && http.status == 200) {
            var result= http.responseText;
            var comprobar= 'tmp';
            if (result.indexOf(comprobar) !== -1) {
                document.getElementById('cuadroIMG').src = http.responseText;
            }else{
                alert(http.responseText);
            }
        }
    }
} 

HTML:

<form id="form">
        <input type="file" id="fileselectInput" onchange="previewIMG()"><br>
    </form>

非常感谢!

最佳答案

除了 Amauri 已经很好地涵盖了 utf-8 问题之外,您可能想做的另一件事是:

替换

$ruta ="tmp/".$_FILES["file"]["name"];
$rutafinal =str_replace(" ","_",$ruta); //Change " " for "_"

$ruta      = "tmp/".$_FILES["file"]["name"];
$fileExtension = substr($ruta,stripos ($ruta,'.'));
$rutafinal = 'tmp/' . md5(time() . $ruta).'.'.$fileExtension;

这将创建一个 md5当前时间戳和文件名的哈希值作为新文件名,从而使您更有可能确保文件名在系统上是唯一的,并消除“特殊字符”。

我喜欢做的一件事是还使用用户唯一的 ID(如果存在)作为补充,以防止两个用户上传相同文件时出现问题(可能会经常发生像 avatar.jpeg 这样的文件名)。

毕竟,md5 并不是无碰撞的,因此您可能需要在这里做一些额外的工作。 增加机会的一种方法是使用时间戳驱动目录:

$rutafinal = 'tmp/' . date("Y/m/d/h/i", time()) . '/'. md5(time() . $ruta).'.'.$fileExtension;

例如,这会将您的文件放入

<yourimageuploadfolder>/2014/04/10/14/04/5eb63bbbe01eeed093cb22bb8f5acdc3.jpg

关于javascript - PHP 对重音符号和特殊字符进行编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22987090/

相关文章:

javascript - 信息气泡始终显示在最后一个标记上

javascript - 主干 - 根据条件更改 tagName

javascript - 隐藏 div(取决于按下的按钮)

javascript - 不推荐使用同步 XMLHTTPRequest 导致浏览器崩溃?

javascript - JS 目标函数到达构造函数不起作用

Javascript绘制图像函数失败

php - 如何在 phpMyAdmin 中编写存储过程?

php - 如何将 MySQL 配置为 Zend DB Adapter 中的适配器

php - 当表格由 PHP 函数构建时,是什么阻止表格使用 CSS 正确格式化?

javascript - 在某些情况下禁止用户离开页面