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

时间:2014-07-12 10:52:36

标签: 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";
}

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

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

7 个答案:

答案 0 :(得分:6)

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

 <?php header('Content-type: text/html; charset=utf-8');

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

AddDefaultCharset Off

这可以解决您的命名文件。但正如某人的建议,我认为更好(避免上传具有相同名称的文件)以使用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;

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

答案 1 :(得分:2)

您可以随时urlencode显示名称,然后显示或下载urldecode

将原始数据传递给文件系统IMHO是一个坏主意。多年来,我们看到黑客使用文件名来启用远程执行,所以无论如何我都会urlencode作为安全预防措施。

如果您的应用只能通过网络界面访问,那么在展示之前,urldecode它是微不足道的。如果对文件系统有一些本地访问权限,那么您可能希望保留实际文件名。

编辑:Thomas P的回答是可以的,但是有人改变形式并导致各种问题是微不足道的。一般来说,处理异常和安全性更安全。格式化服务器端并始终假设用户将输入垃圾数据。

答案 2 :(得分:1)

您的代码绝对有效。您只需要对编码进行一些调整。

为了确保在浏览器发送文件名时正确编码文件名(以便服务器正确接收它,您必须在包含上传表单的页面上定义正确的编码。

实际上,一旦浏览器发送请求,它就无法更改它,即使响应(如其他响应所示)也定义了编码。这意味着,如果您想获得干净的文件名,则必须在上传表单页面上设置正确的编码。

这是一个有效的例子:

<!DOCTYPE html>
<html>
<head>
     <title>My awesome form</title>
     <meta charset="utf-8" /><!-- This is the important tag -->
</head>
<body>
    <form action="send.php" method="post" enctype="multipart/form-data">
        <input type="file" name="file" />
        <input type="submit" />
    </form>
</body>
</html>

在收到帖子的文件(此处为send.php)上,应该正确接收所有内容。您可以使用var_dump($_FILES)检查发送的名称是否正确。如果情况并非如此,那么您的表单可能没有包含正确的编码声明(这意味着您没有包含<meta>标记,或者标题可能会覆盖{ {1}}代码。在这种情况下,请在处理上传表单的文件开头添加<meta>

答案 3 :(得分:0)

您可以使用不同语言查看此链接以使用php和数据库(如mysql)。我希望它可以帮助你。

正如他们在此链接中所说,您可以尝试:

<meta http-equiv="Content-Type" content="text/html; 
charset=UTF-8" />

http://www.9lessons.info/2011/08/foreign-languages-using-mysql-and-php.html

<强>更新

查看“Common Character Encodings”链接底部的常见编码类型,并选择适合您需求的类型:

http://en.wikipedia.org/wiki/Character_encoding

答案 4 :(得分:0)

我会阅读以下论坛read this。你应该重命名这个文件,这样你就不会得到胡言乱语的名字。如果您想要我提供给您的论坛的真实姓名提供解决方案。

答案 5 :(得分:0)

使用mb_string允许不同的字符集 您也可以尝试使用iconv转换为ASCII // TRANSLIT 在保存之前在文件名上尝试其中一个。

HTH

答案 6 :(得分:-1)

试试这个

  1. 首先获取文件扩展名;
  2. 重命名文件,例如time().random(1,1000).$extension;
  3. 建议:使用英文文件名,因为它会在浏览器中很好地显示。