Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/240.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用php检查文件大小和类型_Php_Html - Fatal编程技术网

使用php检查文件大小和类型

使用php检查文件大小和类型,php,html,Php,Html,我的任务是制作一个php文件,用于将文件上载到目录。只有当文件大小小于512kb且文件类型为txt、zip或jpg时,用户才能上载文件。我的代码工作不正常,因为如果文件不相关,它会忽略输出,并且也不会正确检查文件类型。有人能帮忙吗 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Files</title> </head> <body

我的任务是制作一个php文件,用于将文件上载到目录。只有当文件大小小于512kb且文件类型为txt、zip或jpg时,用户才能上载文件。我的代码工作不正常,因为如果文件不相关,它会忽略输出,并且也不会正确检查文件类型。有人能帮忙吗

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Files</title>

</head>

<body>



<form method="POST" enctype="multipart/form-data">
<input type="file" name="dat">
<input type="submit" value="Upload">
<div>(max. size: 512kb, Type: jpg,txt,zip)</div>
</form>
<?php
if(isset($_FILES["dat"])){
    $file=$_FILES["dat"];
    $name=$file["name"];
    $size=$file["size"];
    $location=$file["tmp_name"];
    $location_file=$location . basename($name);


    if($size>512000 or $location_file!="txt" or $location_file!="zip" or $location_file!="jpg"){
        echo "The file is too big or the format is not correct...";
    }
    else{
        move_uploaded_file($location,"files/".$name);
    }
}

?>
</body>

</html>

文件夹
(最大尺寸:512kb,类型:jpg,txt,zip)

对于格式,您需要从文件名中取出扩展名,如下所示:

$explode=explode(“.”,$name);
$extension=$explode[sizeof($explode)-1]//返回“txt”、“zip”或任何内容
if(!in_数组($extension,[“zip”,“txt”,“jpg”,“jpeg”])){
//格式错误:格式不正确
}否则{
//格式确定
$finfo=finfo\u open(FILEINFO\u MIME\u类型);
$mime=finfo_文件($finfo,$_文件['dat']['tmp_名称]]);
$allowed\u mime\u类型=[
“图片/jpg”,
“图像/jpeg”,
“应用程序/zip”,
“纯/文本”
];
if(!in_数组($mime,$allowed_mime_类型)){
//错误格式
}否则{
//格式确定
}
}

首先尝试调试上载的文件。其次,不要依赖文件名,因为它很容易被欺骗。 tmp_name为您提供文件的临时位置,它将是一个随机字符串。 您最好的选择是在tmp_名称上调用
getimagesize
,用于图像,
finfo_open
new-finfo
用于其他文件类型以比较其mime类型,您还可以
分解该名称并使用
end
,这也将为您提供扩展名。可以定义一个已接受扩展名的数组,并在_array
中使用
检查扩展名是否有效。
将提供示例代码后,我得到一台电脑

LE:正如承诺的那样,使用注释和安全概念进行更复杂的检查

html端的

<input type="file" name="dat" accept=".txt, .zip, .jpg">

在服务器端:

<?php

$extension = array_pop(explode(".", $_FILES["dat"]["name"])); // return file extension

if(in_array($extension, array("zip", "txt", "jpg"))) // check if extension is valid
{
   if($_FILES['dat']['size'] > 512*1024) // check file size is above limit
   {
       echo "File size above limit";
   }
   else
   {
       move_uploaded_file($_FILES['dat']['tmp_name'],"files/".$_FILES['dat']['name']); // moving uploaded file
   }
}
else
{
  echo "Invalid file type";
}

我的php有点生疏,但首先,我想
$location\u file
包含的不仅仅是文件扩展名,因此将其与扩展名进行比较总是返回false。你试过调试吗?确保不要在生产中使用这段代码,因为它很容易出现空字节注入,而且仅仅检查扩展是件坏事,这也会导致更多的安全问题
<?php

$extension = array_pop(explode(".", $_FILES["dat"]["name"])); // return file extension

if(in_array($extension, array("zip", "txt", "jpg"))) // check if extension is valid
{
   if($_FILES['dat']['size'] > 512*1024) // check file size is above limit
   {
       echo "File size above limit";
   }
   else
   {
       move_uploaded_file($_FILES['dat']['tmp_name'],"files/".$_FILES['dat']['name']); // moving uploaded file
   }
}
else
{
  echo "Invalid file type";
}