在 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 数组。在我这样做之后,这个问题对我来说就消失了,接受的答案就像一个魅力。只是想我会将信息传递给其他偶然发现此问题的人。
【讨论】:
给每个文件输入一个唯一的名称是什么意思?使用单个<input type="file" name="files[]" multiple="multiple" />
和使用多个输入字段行是有区别的。使用单个输入字段,您可以从文件浏览器窗口中选择多个文件。使用多个输入字段,您一次只能选择一个文件,我认为这会降低选择多个文件的功能,但我想它可以工作。也许你可以多解释一下你的意思?
另外,我也在使用name='files[]'
,所以我知道你在说什么。在 Ajax 调用中,我像这样循环遍历 files[]:formData.append('date',document.getElementById('date').value); var ins = document.getElementById('files').files.length; for (var x = 0; x < ins; x++) formData.append("files[]", document.getElementById('files').files[x]);
在控制器中,这会生成一个 $_FILES 数组,您可以使用echo "<pre>"; print_r($_FILES); echo "</pre>";
检查它仍然,上述接受的答案对我不起作用,所以我仍然在做错事。 ://以上是关于在 CodeIgniter 中上传多个文件的主要内容,如果未能解决你的问题,请参考以下文章