我正在尝试创建一个允许用户将图像上传到目录的页面。页面的上传段如下所示:
<form action="resources/includes/uploaded.php" method="post" enctype="multipart/form-data">
<input type="file" name="file" id="file">
<input type="text" name="description">
<button class="newimage" type="submit">Upload</button>
</form>
我的PHP函数看起来像这样:
$_SESSION['random'] = substr(number_format(time() * rand(),0,'',''),0,15);
$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"] < 200000000)
&& in_array($extension, $allowedExts))
{
if ($_FILES["file"]["error"] > 0)
{
}
else
{
if (file_exists("../../uploads/" . $_SESSION['random']))
{
}
else
{
move_uploaded_file($_FILES["file"]["tmp_name"],
"../../uploads/" . $_SESSION['random']);
}
}
}
else
{
echo "Invalid file";
}
...DATABASE QUERIES ETC.
上传导致在上传设定限制范围内的图像时打印“无效图像”。我不确定文件在那里是什么问题,它在函数中被正确命名和引用 - 任何想法?
答案 0 :(得分:2)
本来是把它写成评论,但是时间太长了:
调试步骤1
首先尝试将所有条件分解为单独的if语句,以便它返回是否通过这些条件..所以,如果你有if ( ( A || B || C ) && D && E)
,那么为A写出** if (A) { echo "A is true" } else { "A is false" }
E,然后看看你的真实价值是否符合预期。
如果你的价值观不符合预期,那你的情况就错了。
如果你的价值是你所期望的那样,那么你的逻辑是错误的。
让我们知道是哪种情况,我们可以更有效地帮助您:)
**此外,您可以使用以下内容,而不是为A到E写出if (A) { echo "A is true" } else { "A is false" }
:
function check($letter, $condition)
{
$retval = ($condition) ? "True" : "False";
echo $letter." is ".$retval;
}
check( ($_FILES["file"]["type"] == "image/gif") );
.
.
.
答案 1 :(得分:2)
您的代码可以通过多种方式得到改进。您当前正在根据图像的mime-types检查文件类型。检查输入文件是否与mime类型匹配并不会真正阻止任何事情。它很容易被欺骗,$_FILES['file']['mime-type']
不应该被信任。它们仅用作提示,不应用于验证用户上传。
在您的代码中出现问题时,您当前正在将图像mime-types与一组预定义的mime类型进行比较。我将删除该条件语句,并改为使用getimagesize()
:
$image = getimagesize($_FILES['image']['name']);
$mime_type = $image['mime'];
此外,您目前正在使用explode()
提取文件名:
$temp = explode(".", $_FILES["file"]["name"]);
$extension = end($temp);
这很好,并且可以按预期工作。但您可以改为使用pathinfo()
函数,这是专门为此目的而设计的。
$path = $_FILES['file']['name'];
$extension = pathinfo($path, PATHINFO_EXTENSION);
以下是您的代码(未经测试)的改进版本:
$allowedExts = array("gif", "jpeg", "jpg", "png");
$imagesize = $_FILES["file"]["size"]; //storing size into a variable
$path = $_FILES['file']['name'];
$extension = pathinfo($path, PATHINFO_EXTENSION);
$image = getimagesize($_FILES['file']['name']);
$mime_type = $image['mime'];
if (in_array($extension, $allowedExts) && $size < 200000000)
{
if ($_FILES["file"]["error"] == 0) //0 means no errors
{
if (!file_exists("../../uploads/" . $_SESSION['random']))
{
move_uploaded_file($_FILES["file"]["tmp_name"],
"../../uploads/" . $_SESSION['random']);
}
}
}
else
{
echo "File validation failed.";
}
希望这有帮助!
答案 2 :(得分:0)
试试这个
<强> HTML 强>
<input type="file" name="img" />
<强> PHP 强>
$_width = 125;
$_height = 150;
$imageData = @getimagesize($_FILES["img"]["tmp_name"]);
if((($_FILES["img"]["type"] != "image/jpeg")&& ($_FILES["img"]["type"] != "image/png")&& ($_FILES["img"]["type"] != "image/jpg") && ($_FILES["img"]["size"] > 50000) && (($imageData[0] != $_width) && ($imageData[1] != $_height) ) ){
echo "validation not met";
}