使用非英文文件名上传图片

Nav*_*eva 2 php file-upload

我有以下PHP代码:

$allowedExts = array("gif", "jpeg", "jpg", "png", "PNG", "JPG", "JPEG", "GIF");
$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"] < 2000000)
    && in_array($extension, $allowedExts)) {
    if ($_FILES["file"]["error"] > 0) {
        echo "Return Code: " . $_FILES["file"]["error"] . "<br>";
    } else {
        $file_name = "images/".$_FILES["file"]["name"];
        if (file_exists("../images/" . $_FILES["file"]["name"])) {
            echo $_FILES["file"]["name"] . " already exists. ";
        } else {
            move_uploaded_file(
                $_FILES["file"]["tmp_name"],
                "../images/" . $_FILES["file"]["name"]
            );
            echo "Stored in: " . "../images/" . $_FILES["file"]["name"];
        }
    }
} else {
    echo "Invalid file";
}
Run Code Online (Sandbox Code Playgroud)

此代码适用于其名称为英文的文件(如'Example.jpg')但对于名称不是英文的文件,保存文件的名称为:''•'''•_'' ¡_1.jpg

为什么以及如何解决它?谢谢!

sen*_*rio 6

在php文件中"接收"文件,尝试添加:

 <?php header('Content-type: text/html; charset=utf-8');
Run Code Online (Sandbox Code Playgroud)

如果您正在处理Apache,请记住检查AddDefaultCharset的值

AddDefaultCharset Off
Run Code Online (Sandbox Code Playgroud)

这可以解决您的命名文件.但正如某人的建议,我认为更好(避免上传具有相同名称的文件)以使用hashvalue在文件系统中保存文件名.

$tmpFile = $_FILES["file"]["tmp_name"];
$fileName = $_FILES["file"]["name"];
$ext = pathinfo($fileName, PATHINFO_EXTENSION);
$newFileName = "../images/" . md5(time() . $fileName) . ;
move_uploaded_file($tmpFile, $newFileName);
echo "Stored in: " . "../images/" . newFileName;
Run Code Online (Sandbox Code Playgroud)

我总是保存在数据库原始名称和散列名称.这个,因为我想保存原始名称,即使我上传了一百个同名文件,但我不想覆盖文件系统文件.有很多技巧可以避免这种名称冲突......