php drop文件大小的文件类型错误
问题描述:
Fellas, 我在我的代码中运行一个有趣的错误,我找不出原因。php drop文件大小的文件类型错误
我有一个3字段的表单。名称,电子邮件,文件上传字段。填充字段后,将其发送回相同的文件。
<form enctype="multipart/form-data" method="POST" action="index.php">
<input type="text" name="name" value="<?php if(isset($_POST['name'])&&!empty($_POST['name'])){ echo $_POST['name'];}?>" maxlength="100" />
<input type="text" name="email" value="<?php if(isset($_POST['email'])&&!empty($_POST['email'])){ echo $_POST['email'];}?>" maxlength="50" />
<input type="hidden" name="MAX_FILE_SIZE" value="2097152" /> <input type="file" name="file_upload" size="15" value="<?php if(isset($_FILES["file_upload"]["name"])&&!empty($_FILES["file_upload"]["name"])){ echo $_FILES["file_upload"]["name"];}?>"/>
<input type="submit" name="submit" value="" id="image-button" />
</form>
所以表单发送回index.php。现在的错误处理:(错误字段的值都在匈牙利,但我翻译必要的字段)
$upload_errors = array(
// http://www.php.net/manual/en/features.file-upload.errors.php
UPLOAD_ERR_OK => "Nincsenek hibák.",
UPLOAD_ERR_INI_SIZE => "Nagyobb a megengedett fileméretnél.",
UPLOAD_ERR_FORM_SIZE => "Nagyobb a form megengedett fileméreténél.",
UPLOAD_ERR_PARTIAL => "Részleges feltöltés.",
UPLOAD_ERR_NO_FILE => "File nem található.",
UPLOAD_ERR_NO_TMP_DIR => "Átmeneti könyvtár nem található.",
UPLOAD_ERR_CANT_WRITE => "Nem írható cél mappa.",
UPLOAD_ERR_EXTENSION => "Hibás kiterjesztés."
);
if(isset($_POST['submit'])){
$errors = array();
$required_fields = array('name' => 'A név megadása kötelező.', 'email' => 'E-mail cím megadása kötelező.');
foreach($required_fields as $key => $value) {
if (!isset($_POST[$key]) || empty($_POST[$key])) {
$errors[] = $value;
}
}
if(!is_valid_email($_POST['email'])){
$errors[] = 'Set a correct mail address.';
}
if($_FILES["file_upload"]["size"]>2097152){
$errors[] = 'Maximum 2MB file size.';
}
if(!isset($_FILES["file_upload"]["name"])||empty($_FILES["file_upload"]["name"])){
$errors[] = 'You must upload a picture!';
}
if (($_FILES["file_upload"]["type"] !== "image/png")&& ($_FILES["file_upload"]["type"] !== "image/jpg") && ($_FILES["file_upload"]["type"] !== "image/jpeg") && ($_FILES["file_upload"]["type"] !== "image/pjpeg")){
$errors[] = 'Only PNG or JPG/JPEG files allowed.';
}
当我尝试上传文件的文件大小为2MB +错误再次出现:
- 只允许使用PNG或JPG/JPEG文件。 -
此错误属于文件类型!表单验证返回一个不同的错误!
问:
为什么出现这种情况?为什么不触发最大2MB文件大小。错误???
答
如果一个文件是比upload_max_filesize
[docs]更大(这通常是2MB),PHP将忽略文件,设置['size']
到0
并['error']
到UPLOAD_ERR_INI_SIZE
。
检查['error']
而不是['size']
。
见http://docs.php.net/manual/en/features.file-upload.post-method.php
BTW,你不应该依赖于["type"]
,它是由客户端设置,客户端可以将其设置为任何他想要的。
我相信它应该是OR而不是AND。所以,如果它是这些文件类型之一,然后接受它。 – Matt
这可能不会对您的具体问题有所帮助,但是...... 1)您不能依赖MIME类型来验证文件的格式,浏览器可能根本不会发送它,并且您可以很容易地对其进行欺骗。但是如果你要依靠这个,你可以通过创建一个允许的MIME类型的数组(让我们称之为'$ allowedTypes')来让你的代码更容易阅读,并且更容易添加新的类型,然后通过检查它调用'in_array($ _ FILES [“file_upload”] [“type”],$ allowedTypes)' – DaveRandom
@Matt不正确,因为他正在检查它是否等于AND NOT NOT等于...所以当它等于其中一个表达式评估为TRUE – DaveRandom