我目前正在使用此PHP代码进行上传功能。我需要知道如何添加一些文件类型验证1)扩展,2)文件大小限制和3)检查实际上是否选择上传文件。
感谢您的帮助。
<?php
if(isset($_POST['submit'])){
if(count($_FILES['upload']['name']) > 0){
//Loop through each file
for($i=0; $i<count($_FILES['upload']['name']); $i++) {
//Get the temp file path
$tmpFilePath = $_FILES['upload']['tmp_name'][$i];
//Make sure we have a filepath
if($tmpFilePath != "tmp/"){
//save the filename
$shortname = $_FILES['upload']['name'][$i];
//save the url and the file
$filePath = "uploads/" . date('d-m-Y-H-i-s').'-'.$_FILES['upload']['name'][$i];
//Upload the file into the temp dir
if(move_uploaded_file($tmpFilePath, $filePath)) {
$files[] = $shortname;
//insert into db
//use $shortname for the filename
//use $filePath for the relative url to the file
}
}
}
}
header('Location: http://localhost/FloodMap/report.html');
exit;
}
?>
答案 0 :(得分:1)
检查文件扩展名
$tmpFilePath = $_FILES['upload']['tmp_name'][$i];
$imageFileType = pathinfo($tmpFilePath,PATHINFO_EXTENSION);
if($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg"
&& $imageFileType != "gif" ) {
echo "Only JPG, JPEG, PNG & GIF files are allowed.";
}
检查文件大小
if ($_FILES["upload"]["size"][$i] > 500000) {
echo "Sorry, your file is too large.";
}
检查收到的文件
if($_FILES['upload']['tmp_name'][$i]!=""){
}
答案 1 :(得分:1)
According to the manual PHP在validates_presence_of :primary_product, scope: :student_id
数组中返回错误代码。例如......
$_FILES
虽然if ($_FILES['upload']['error'] == UPLOAD_ERR_OK) {
/* the file was uploaded successfully */
}
数组确实提供了扩展程序,但请务必记住这是客户端提供的数据,因此无法信任。事实上,你可以信任的那个数组中唯一的东西就是PHP提供的错误和tmp_name。其他一切都来自客户。
因此,为了验证文件是否符合您的预期,您必须检查文件魔术MIME字节与finfo_file
$_FILES
同样,如前所述,虽然$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mimeType = finfo_file($finfo, $_FILES['upload']['tmp_name']);
$allowedMimes = ['image/jpg','image/gif','image/png'];
if (!in_array($mimeType, $allowedMimes, true)) {
throw new FileException("File not allowed...");
}
数组提供了上传的大小键,但这是客户端提供的数据,不应该被信任。相反,只需与$_FILES
核对即可。这样你就可以检查文件的实际大小了。
FWIW,检查服务器级别的文件大小(如果唯一的目的是告诉用户此文件太大)会导致相当糟糕的用户体验。最好先在客户端级别做这样的事情,这样他们就会知道,如果文件太大,他们甚至还要上传文件。
在HTML5中,我们可以使用File API执行此操作。在您的表单中,只需附加一些事件监听器,如filesize($_FILES['upload']['tmp_name'])
或其他内容,然后检查onchange
以提醒用户。您也可以对文件类型执行相同的操作。
当然,如果您需要用于其他目的,我建议您不要检查服务器端的文件大小限制。只是说,就其自身而言,如果它是告诉用户他们上传文件太大的唯一方法,那就会削弱用户体验。