【问题标题】:php drops file type error for file sizephp 丢弃文件大小的文件类型错误
【发布时间】:2011-09-06 18:07:15
【问题描述】:

伙计们, 我在我的代码中遇到了一个有趣的错误,但我无法找出原因。

我有一个包含 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 文件大小。错误???

【问题讨论】:

  • 尝试调试你的脚本:$errors[] = 'Only PNG or JPG/JPEG files allowed. File size: '.$_FILES["file_upload"]["size"];
  • 我认为应该是 OR 而不是 AND。因此,如果它是其中一种文件类型,则接受它。
  • 这可能对您的具体问题没有帮助,但是... 1) 您不能依赖 MIME 类型来验证文件的格式,浏览器可能根本不会发送它并且你可以很容易地欺骗它。但是如果你要依赖这个,你可以让你的代码更容易阅读,更容易添加新类型,方法是创建一个允许的 mime 类型数组(我们称之为$allowedTypes),然后通过调用来检查它in_array($_FILES["file_upload"]["type"],$allowedTypes)
  • @Matt 不正确,因为他正在检查它是否不等于 AND 不等于...所以当它等于其中一个时,表达式的计算结果为 TRUE
  • php.ini 中的上传限制是多少?

标签: php forms validation


【解决方案1】:

如果文件大于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

顺便说一句,您不应该依赖["type"],它是由客户端设置的,客户端可以将其设置为任何他想要的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多