【问题标题】:Multiple file upload validation in PHP not workingPHP中的多个文件上传验证不起作用
【发布时间】:2017-11-17 13:27:33
【问题描述】:

我正在尝试验证我所有上传的文件,实际上我进行了文件大小和文件类型验证。如果任何文件的验证失败,我会记录该特定文件以获取错误消息。我将每个循环用于文件处理以及用于文件大小和文件类型验证的 if 条件,但问题仅在评估条件时首先出现,如果块在第二次出现未经测试。两个 if 都位于每个循环的内部。任何帮助将不胜感激...

代码

 public function validate_my_files(){

     foreach($this->files_from_user_validateit['name'] as $key => $value){
        $name = $this->files_from_user_validateit['name'][$key];
        $size = $this->files_from_user_validateit['size'][$key];
        $type = $this->files_from_user_validateit['type'][$key];
        //$error[$key] = $this->files_from_user_validateit['error'][$key];
        //$tmp_name[$key] = $this->files_from_user_validateit['tmp_name'][$key];

        //not allowed file extensions
        $not_allowed_ext = array('php','js','asp','aspx','py','c','c++','jsp','perl','cfg','css','java',
                                  'json');
        //lets find the extension of the filename
        $est = explode('.',$name);
        $ext = $est[count($est)-1];
        if(in_array($ext,$not_allowed_ext)){
          //putting in session for later message
          $_SESSION['ext'][] = $name;
        }

        //lets check for file size now, lets not allow file greater than 50MB 
        if($size > 47185920){
          $_SESSION['size'][] = $name;
        }
     }
     print_r($_SESSION);die();
   }

仅测试文件扩展名,而如果大小条件不起作用...

编辑

很遗憾,我的上传表单存在很大问题。稍后选择的文件仅由 $_FILES 处理,我正在使用多个文件上传并使用 java 脚本在同一页面的表上显示选定的文件。假设我首先选择了 5 个文件(表上显示的 5 个文件),然后再次选择 3 个文件,现在表上总共有 8 个文件。但是我第二次选择的最后 3 个文件在 $_FILES 数组中可用。请任何人对此有解决方案...

重新编辑

Id 'myfiles' 用于保存来自输入文件字段的多个文件。 Id 'dataS' 是由下面给定 JS 创建的表的 div。 IF 'tot' 是表中文件总大小的跨度。 输入形式:

   <form id="uploadform" method="post" action="" enctype="multipart/form-data">
        <div id="datas"></div>

        <div id="tot"><h3>TOTAL SIZE:</h3> <span id="zise">0 MB</span></div>

        <div id="addfiles"><input type="file" name="addfiles[]" value="Add Files" multiple="multiple" id="myfiles" ></div>

         <input type="submit" name="sbmtfile" style="color:green;font-size: 17px;">

    </form>

我的 JS:

<script type="text/javascript">
   var s = 1;
   var totsize = 0;

   myfiles.onchange = function(){
      var a = document.getElementById('myfiles').files;
      var b = document.getElementById('datas');
      var total = document.getElementById('tot');//for table title

    var c = document.createElement('TABLE');
    c.className = 'showtable';
    c.border = '1px';
    c.cellspacing = '0';
    c.cellpadding = '2';
    c.width = '100%'

    for(var i = 0; i < a.length; i++){
        var f = document.createElement('TR');
        c.appendChild(f);
        //for total file size
        totsize = totsize + a[i].size;

        var r = document.createElement('TD');
        r.align = 'center';
        r.width = '152px';
        f.appendChild(r);
        r.appendChild(document.createTextNode(s++));

        var y = document.createElement('TD');
        y.align = 'left';
        y.width = '610px';
        y.appendChild(document.createTextNode(a[i].name));
        f.appendChild(y);

        var z = document.createElement('TD');
        z.align = 'center';
        r.width = '152px';
        z.appendChild(document.createTextNode(Math.round((a[i].size)/1024)));
        f.appendChild(z);

        var x = document.createElement('TD');
        x.align = 'center';
        x.width = '152px';
        x.appendChild(document.createTextNode('DELETE'));
        f.appendChild(x);
    }

    b.appendChild(c);
    document.getElementById('zise').innerHTML = Math.round((totsize/(1024*1024)))+ ' MB';
 }

</script>

【问题讨论】:

  • files_from_user_validateit() 是自定义函数吗?由于您正在检查if($size &gt; 47185920),基本上是if($this-&gt;files_from_user_validateit['size'][$key]; &gt; 47185920),因此您需要检查它返回的值。
  • @Sean ($this->files_from_user_validateit) 保存了我所有上传的文件,我从表单中获取,即它是一个文件数组并且工作正常,我可以获取我上传的所有文件文件在这里...

标签: php mysql file-upload upload


【解决方案1】:

您在寻找else 语言元素吗?

if (in_array($ext,$not_allowed_ext)) {
          //putting in session for later message
          $_SESSION['ext'][] = $name;
} else {
  ####
    //lets check for file size now, lets not allow file greater than 50MB 
    if ($size > 47185920) {
        $_SESSION['size'][] = $name;
    }
}

仅在不违反扩展名的情况下检查大小。

(这个不是我做的漂亮的例子,还有else if,但如果你不知道else,我觉得还是先看else更重要)

【讨论】:

    【解决方案2】:

    正如你所说,我们的第一个 if 条件工作正常但不能正常工作,所以我在 for 循环中解决了问题。所以只需检查一下它会有所帮助

    公共函数 validate_my_files(){

     foreach($this->files_from_user_validateit as $key => $value){
        $name = $value['name'][$key];
        $size = $value['size'][$key];
        $type = $value['type'][$key];
        //$error[$key] = $this->files_from_user_validateit['error'][$key];
        //$tmp_name[$key] = $this->files_from_user_validateit['tmp_name'][$key];
    
        //not allowed file extensions
        $not_allowed_ext = array('php','js','asp','aspx','py','c','c++','jsp','perl','cfg','css','java',
                                  'json');
        //lets find the extension of the filename
        $est = explode('.',$name);
        $ext = $est[count($est)-1];
        if(in_array($ext,$not_allowed_ext)){
          //putting in session for later message
          $_SESSION['ext'][] = $name;
        }
    
        //lets check for file size now, lets not allow file greater than 50MB 
        if($size > 47185920){
          $_SESSION['size'][] = $name;
        }
     }
     print_r($_SESSION);die();
    

    } 换个方式

    $this->files_from_user_validateit['name']
    

    $this->files_from_user_validateit
    

    $this->files_from_user_validateit['name'][$key]
    

    $value['name'][$key]
    

    也许对你有帮助。

    【讨论】:

    • 感谢这位兄弟,但不幸的是我的表单存在很大问题(如编辑部分所述)。如果您有任何解决方案,请建议...
    • 我知道你在 java 脚本中有问题,所以你能在这里给你看脚本来上传文件吗?
    • 您好,请确保仅在 html 中添加表格并从脚本中附加 tr 和 td。然后在 php 中进行更改然后测试它会正常工作。
    • 我正在尝试使用 ajax 解决它,如果我得到正确的结果,我会在这里发布我的脚本。感谢您的帮助兄弟...
    猜你喜欢
    • 1970-01-01
    • 2015-10-18
    • 2023-04-06
    • 2014-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-17
    相关资源
    最近更新 更多