在 CodeIgniter 中上传多个文件

Posted

技术标签:

【中文标题】在 CodeIgniter 中上传多个文件【英文标题】:Upload multiple files in CodeIgniter 【发布时间】:2012-01-12 17:10:20 【问题描述】:

在我的 CodeIgniter 项目中,我在项目创建期间上传文件。上传功能如下:

function uploadFiles()

     $this->load->library('upload');  
     $error = 0;    
     $projectName = $_POST['projectname'];
     mkdir('./uploads/'.$projectName);

     for($i=0; $i<count($_FILES); $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];

       $config['upload_path']   = './uploads/'.$projectName;
       $config['allowed_types'] = 'xml|etl';
       $config['max_size']      = '0';
       $config['overwrite']     = TRUE;

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

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

     if($error > 0) return FALSE; else return TRUE; 


我在 create_project 函数中这样调用这个函数:

public function create_project() 
    $this->load->library('form_validation');

    $this->form_validation->set_rules('projectname', 'Project name', 'required');

    $this->form_validation->set_message('required', 'This is an obligatory field');

    if($this->form_validation->run() == FALSE) 
        $this->load->view('project_creation_view');
     else 
        $this->load->model('Project_management_model');
        $this->Project_management_model->create_project();
        $this->uploadFiles();
    

但是这并没有做任何事情。文件未上传。甚至没有创建一个空目录。谁能帮我找出错误?

谢谢。

【问题讨论】:

查看页面 roytuts.com/codeigniter-multiple-files-upload/ 【参考方案1】:

我想你错过了这个:

$config['file_name'] = 'somename_'.$i; $config['upload_path'] = './uploads/'.$projectName; ...

【讨论】:

【参考方案2】:

这是我为上传多个文件而修改的 CI_Upload 类的扩展,只需将其复制到 MY_Upload.php 文件中即可。它也制作了目录。

http://pastebin.com/g9J6RxW1

那么你需要在控制器函数中做的就是将你的文件排列到一个数组中,其中字段的名称和键是数组键,配置是数据。在你的情况下是这样的:

$project_files['files'][0] = array(
            'upload_path' => './uploads/'.$projectName.'/',
            'max_size' => 0,
            'allowed_types' => 'xml|etl',
            'overwrite' => TRUE,
            'remove_spaces' => TRUE,
        );
$project_files['files'][1] = array(
            'upload_path' => './uploads/'.$projectName.'/',
            'max_size' => 0,
            'allowed_types' => 'xml|etl',
            'overwrite' => TRUE,
            'remove_spaces' => TRUE,
        );

如果所有文件配置都相同,只需创建一个 for 循环来设置它,它还将采用“命名键”,即。 $project_files['files']['file_key'].

然后只需调用:

 if($this->upload->upload_files($project_files))/*all files uploaded successfully*/

【讨论】:

【参考方案3】:

以为我以前在这里看到过同样的问题;)

尝试输出 $this->upload->display_errors() 来增加 $error 变量。这会告诉你到底出了什么问题。我的钱花在了权限上……

【讨论】:

【参考方案4】:

您可以上传任意数量的文件..

$config['upload_path'] = 'upload/Main_category_product/';
$path=$config['upload_path'];
$config['allowed_types'] = 'gif|jpg|jpeg|png';
$config['max_size'] = '1024';
$config['max_width'] = '1920';
$config['max_height'] = '1280';
$this->load->library('upload', $config);

foreach ($_FILES as $fieldname => $fileObject)  //fieldname is the form field name

    if (!empty($fileObject['name']))
    
        $this->upload->initialize($config);
        if (!$this->upload->do_upload($fieldname))
        
            $errors = $this->upload->display_errors();
            flashMsg($errors);
        
        else
        
             // Code After Files Upload Success GOES HERE
        
    

【讨论】:

文件数有设置吗?我只能用我的 codeigniter 代码上传 20 个,与此没有太大区别。 它给了我错误 is_uploaded_file() 期望参数 1 是字符串,给定数组,当我尝试调试时,$fieldname 是一个数组。 我试过你的代码我发现这个代码有一个问题。如果用户上传带有图像(文本文件 + 图像)的文本文件或任何其他非图像文件,则它会上传其中的一些并返回文件类型错误。理想情况下,如果其中一个不是图像,它可能不允许任何单个图像。对此有任何帮助吗? @srbhbarot @jason 我也最多只能上传 20 个文件。想要一个解决方案。【参考方案5】:

我修改了Cubed Eye的MY_upload,返回所有上传文件的文件信息。实际上,调用 data 方法时只能访问最后一个文件的信息。我还将上传者的 IP 地址添加到该列表中。

http://pastebin.com/tG8A85gY

可用于以下用途:

$upload_files = $this->upload->upload_files($project_files);
if ($upload_files->status == true)

$fileInfo = $uploaded_files->file_info;

我意识到将其作为 Cubed Eye 的编辑会更好,但这是我的第一篇文章,我没有声誉。

【讨论】:

【参考方案6】:

为简单起见,我创建了这个 CI 帮助文件。您可以从配置文件中加载它并在项目中的任何位置使用它。它只需要 3 个参数

@fileobject = html 文件对象的名称

@fileopath = 你要上传的文件路径

@filetypes = 默认 *,ex- 'jpg|png|mp4|pdf'

function fileUploader($fileobject, $filepath = "uploads/", $filetypes = "*")
// retrieve the number of images uploaded;
$number_of_files = sizeof($_FILES[$fileobject]['tmp_name']);

// considering that do_upload() accepts single files, we will have to do a small hack so that we can upload multiple files. For this we will have to keep the data of uploaded files in a variable, and redo the $_FILE.
$files = $_FILES[$fileobject];

$errors = array();
$file_arr = array();
$result = array();

// first make sure that there is no error in uploading the files
for ($k = 0; $k < $number_of_files; $k++) 
    if ($_FILES[$fileobject]['error'][$k] != 0) $errors[$k][] = 'Couldn\'t upload file ' . $_FILES[$fileobject]['name'][$k];

if (sizeof($errors) == 0) 
    // now, taking into account that there can be more than one file, for each file we will have to do the upload
    // we first load the upload library
    $CI =& get_instance();

    $CI->load->library('upload'); // load library

    // next we pass the upload path for the images
    $config['upload_path'] = FCPATH . $filepath;
    // also, we make sure we allow only certain type of images
    $config['allowed_types'] = $filetypes;
    //$config['max_size'] = (int)(ini_get('upload_max_filesize'));
    $config['max_size'] = '10000';
    $config['overwrite'] = FALSE;

    for ($i = 0; $i < $number_of_files; $i++) 
        $_FILES['uploadedimage']['name'] = $files['name'][$i];
        $_FILES['uploadedimage']['type'] = $files['type'][$i];
        $_FILES['uploadedimage']['tmp_name'] = $files['tmp_name'][$i];
        $_FILES['uploadedimage']['error'] = $files['error'][$i];
        $_FILES['uploadedimage']['size'] = $files['size'][$i];
        //now we initialize the upload library
        $CI->upload->initialize($config);
        // we retrieve the number of files that were uploaded
        if ($CI->upload->do_upload('uploadedimage')) 
            $imageup = $CI->upload->data();
           // print_r($imageup["orig_name"]);die;
            array_push($file_arr, $imageup["orig_name"]);
            $result["response"] = "true";
            $result["message"] = "Files uploaded successfully.";
            $result["files"] = $file_arr;

         else 
            $result["response"] = "false";
            $result["message"][$i] = $CI->upload->display_errors();
        
    

 else 
    $result["response"] = "false";
    $result["message"] = $errors;


return $result;

经过测试和验证。

【讨论】:

【参考方案7】:

由于我的声誉级别,我还不能发表评论,但 Zoom 在接受的答案下发表了评论,指出 $fieldname 变量是一个导致错误的数组。我对那个答案有同样的问题,发现这是因为我在表单上附加了我所有的文件输入名称, [] 这使得 php 将这些输入作为数组变量拾取。要解决这个问题,只需给每个文件输入一个唯一的名称,而不是让它成为一个 PHP 数组。在我这样做之后,这个问题对我来说就消失了,接受的答案就像一个魅力。只是想我会将信息传递给其他偶然发现此问题的人。

【讨论】:

给每个文件输入一个唯一的名称是什么意思?使用单个 &lt;input type="file" name="files[]" multiple="multiple" /&gt; 和使用多个输入字段行是有区别的。使用单个输入字段,您可以从文件浏览器窗口中选择多个文件。使用多个输入字段,您一次只能选择一个文件,我认为这会降低选择多个文件的功能,但我想它可以工作。也许你可以多解释一下你的意思? 另外,我也在使用name='files[]',所以我知道你在说什么。在 Ajax 调用中,我像这样循环遍历 files[]:formData.append('date',document.getElementById('date').value); var ins = document.getElementById('files').files.length; for (var x = 0; x &lt; ins; x++) formData.append("files[]", document.getElementById('files').files[x]); 在控制器中,这会生成一个 $_FILES 数组,您可以使用echo "&lt;pre&gt;"; print_r($_FILES); echo "&lt;/pre&gt;"; 检查它仍然,上述接受的答案对我不起作用,所以我仍然在做错事。 ://

以上是关于在 CodeIgniter 中上传多个文件的主要内容,如果未能解决你的问题,请参考以下文章

在 Codeigniter 中上传多个文件并更改名称文件

在codeigniter中上传多个文件,并使用数组重命名每个文件

如何在codeigniter中上传多个/多个图像[重复]

Codeigniter - 上传多个文件,只有一个输入字段

Codeigniter 多文件上传

使用 CodeIgniter 上传多张图片