我有以下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
为什么以及如何解决?谢谢!
答案 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”链接底部的常见编码类型,并选择适合您需求的类型:
答案 4 :(得分:0)
我会阅读以下论坛read this。你应该重命名这个文件,这样你就不会得到胡言乱语的名字。如果您想要我提供给您的论坛的真实姓名提供解决方案。
答案 5 :(得分:0)
使用mb_string允许不同的字符集 您也可以尝试使用iconv转换为ASCII // TRANSLIT 在保存之前在文件名上尝试其中一个。
HTH
答案 6 :(得分:-1)
试试这个
time().random(1,1000).$extension;