检查CodeIgniter文件上传功能中的文件名

时间:2012-01-13 19:51:08

标签: php validation codeigniter file-upload

我正在使用以下CodeIgniter函数上传工作正常的文件:

function uploadFiles(){

         $this->load->library('upload');
         $error = 0;    
         $projectName = $_POST['projectname'];
         $projectID = $_POST['maxid'];
         $folderName = $this->config->item('upload_dest')."/".$projectName."_".$projectID;
         if(!file_exists ($folderName)){
             $aa = mkdir($folderName);
         }

         $config['upload_path']   = $folderName;
         $config['allowed_types'] = 'xml';
         //$config['allowed_types'] = '*';
         $config['max_size']      = '0';
         $config['overwrite']     = TRUE;

         $this->upload->initialize($config);

         for($i=0; $i<count($_FILES['files']['name']); $i++)
         {

           $_FILES['userfile']['name']    = $_FILES['files']['name'][$i];
           $_FILES['userfile']['type']    = $_FILES['files']['type'][$i];
           $_FILES['userfile']['tmp_name'] = $_FILES['files']['tmp_name'][$i];
           $_FILES['userfile']['error']       = $_FILES['files']['error'][$i];
           $_FILES['userfile']['size']    = $_FILES['files']['size'][$i];

              if($this->upload->do_upload())
              {
                $error += 0;
              }else{
                $error += 1;
              }
         }

         if($error > 0){ 
            $this->upload->display_errors();
            return FALSE; 
         }
         else{ 
            return TRUE; 
         }

    }

我需要做的是 - 检查以确保至少有一个正在上传的文件名为“etl”。如果用户选择的文件列表中没有这样的文件 - 停止操作,不上传任何内容并返回表单验证错误。有人可以就此提出建议吗?

感谢。

2 个答案:

答案 0 :(得分:1)

首先,从php上传之前无法获取文件的名称,必须上传才能获取文件的属性。因此,可用的选项是:

(1)允许上传文件,然后获取名称并检查是否包含“etl”。如果non包含您要查找的内容,则删除刚刚上传的文件,并自行设置自定义错误消息。 这种方法具有非常大的开销成本,允许您首先上载不需要的内容,然后删除它。非常差但解决了这个问题。

(2)另一方面,是javascript解决方案。为上载字段指定一个公共类名  例如“userfile1”,“userfile2”,.......

然后从你的javascript和使用jquery,拦截表单的提交,然后使用for循环来获取每个文件上传字段的值,从中可以获得文件的全名和扩展名然后做你的“etl”比较。

<script type="text/javascript" >
  $("#formname").submit(function(){
    $(".classname").each(function(){
      if($(this).val().indexOf("etl") != -1 ){
        return true;
      }
    });
    /*
     *whatever makes it finish executing that loop and the execution of code gets 
     *to this point, then the string "etl" was not found in any of the names.
     */
     // write a piece of code to show an hidden error field
     $("#hidden_error_div").text("Your error message").show();
     return false;  //makes sure the form is not submitted.
  });
</script>

希望这有帮助。

答案 1 :(得分:0)

Oyekunmi在实际到达服务器之前提供了一个很好的javascript解决方案来拦截。正如Oyekunmi指出的那样,一旦它到达那里,它就会作为一个包存在,所以你可以在一个临时目录中存储和处理它,在那里评估每个文件并进行相应的处理。