在我的网站上,我有一个页面,用户可以上传文件以及他们添加的新闻帖子。我允许他们上传一个图像和一个声音文件。如果他们不想要,他们不必添加文件,或者他们可以根据需要添加文件。我遇到的问题是我的脚本只有在用户选择这两个文件时才有效。如果他们选择none或者只选择一个,那么脚本会吐出'Invalid File',因为它找不到一个尚未选择的文件。
我尝试使用:
if (isset($_FILES['filetoupload1'])) {
if (($_FILES["filetoupload1"]["type"] == "image/gif")
|| ($_FILES["filetoupload1"]["type"] == "image/jpeg")
|| ($_FILES["filetoupload1"]["type"] == "image/pjpeg")
|| ($_FILES["filetoupload1"]["type"] == "image/png")
|| ($_FILES["filetoupload1"]["type"] == "image/jpg")
) {
if ($_FILES["filetoupload1"]["error"] > 0) {
echo "Return Code: " . $_FILES["filetoupload1"]["error"] . "<br />";
} else {
if (file_exists("media/" . $_FILES["filetoupload1"]["name"])) {
echo $_FILES["filetoupload1"]["name"] . " already exists. ";
}
move_uploaded_file(
$_FILES["filetoupload1"]["tmp_name"],
"media/" . $_FILES["filetoupload1"]["name"]
);
}
} else {
echo "Invalid file";
}
}
if (isset($_FILES['filetoupload2'])) {
if ($_FILES["filetoupload2"]["type"] == "audio/mp3") {
if ($_FILES["filetoupload2"]["error"] > 0) {
echo "Return Code: " . $_FILES["filetoupload2"]["error"] . "<br />";
} else {
if (file_exists("media/" . $_FILES["filetoupload2"]["name"])) {
echo $_FILES["filetoupload2"]["name"] . " already exists. ";
}
move_uploaded_file(
$_FILES["filetoupload2"]["tmp_name"],
"media/" . $_FILES["filetoupload2"]["name"]
);
}
} else {
echo "Invalid file";
}
}
然后
if((isset($_FILES['filetoupload1'])) && (isset($_FILES['filetoupload2']))) { }
。换句话说,它做到了这一点:
if filetoupload1 isset then run upload script that filters images.
if filetoupload2 isset then run upload script that filters audio.
if filetoupload1 AND filetoupload2 isset then run both upload scripts.
我有这样的设定。以上应该允许文件上传的所有组合。对?但它不起作用..
现在我不知道该怎么做。这是音频的上传脚本,图像几乎相同:
有人可以告诉我,我做错了吗
答案 0 :(得分:2)
“我收到错误:文件无效”
这是正确的,因为您的代码就是这样做的。
不要检查文件是否已设置,但是$_FILES["filetoupload1"]["type"]
是否为空。
答案 1 :(得分:1)
您的脚本使您的服务器容易受到恶意用户攻击网络服务器有权访问的任何文件的攻击:
$_FILES[...]['name'] - user supplied
$_FILES[...]['type'] - user supplied
您相信客户端已为该文件提供了正确的MIME类型,但没有任何内容阻止某人伪造请求并上传“virus.exe”并将mime类型设置为“image / jpeg”。同样,由于远程文件名受用户控制,因此可以使用恶意数据进行破坏。考虑:
$_FILES['picture']['type'] = 'image/gif'
$_FILES['picture']['name'] = 'remote_server_control.php'
根据你的脚本完全合法,因为mime类型是“正确的”,但你现在已经在你的服务器上放置了一个用户提供的PHP脚本,并且可以完全控制你的站点和/或服务器
永远不要相信$_FILES
数组中的数据。始终通过服务器端实用程序确定MIME类型。如果脚本只应处理图像,则使用getimagesize()
。同样,永远不要使用用户提供的文件名。使用确定服务器端的东西为文件命名,例如databasde auto_increment ID号。即使您的代码不允许覆盖现有文件,但只需提出一个新名称并繁荣......远程接管脚本的新版本。
答案 2 :(得分:1)
我建议你添加一个隐藏的文本,这个隐藏的会检查女巫上传字段是否有效,你用javascript进行检查:
<html lang="en">
<head>
<meta charset="utf-8">
<style>
</style>
<script type="text/javascript">
function uploadForm()
{
var size = 0;
var x = document.forms["myForm"]["upload1"].value.length;
var y = document.forms["myForm"]["upload2"].value.length;
if (x > 0)
{
size = 3;
}
if (y > 0)
{
size += 2;
}
return size;
}
</script>
</head>
<body>
<form name="myForm" action="" method="GET" onsubmit="chose.value = uploadForm()">
<input type="file" name="upload1"><br>
<input type="file" name="upload2"><br>
<input type="hidden" name="chose" value=""><br>
<input type="submit" value="Submit">
</form>
</body>
</html>
现在,当你收到表格时,你必须检查选择的字段的值,如果是2,这意味着图像字段不为空,3音频字段不为空,5都不为空:
<?php
switch($_GET["chose"])
{
case 2:
//
break;
case 3;
//
break;
case 5:
//
break;
default:
// here the user doesn't use any field
}
?>