我有以下HTML代码
<form action="form-handler.php" method="post" enctype="multipart/form-data">
<div>
<input id="myfile" name="myfile" type="file">
<input value="Upload ►" type="submit">
</div>
</form>
我想一次上传多个文件。我应该在控制器中如何在codeigniter中上传所选文件?我尝试使用Codeigniter文件上传库,但它没有加载多个文件。虽然,对于1个文件,它工作正常。
答案 0 :(得分:3)
您可以在foreach循环中调用Codigniter的do_upload()函数,该循环遍历已发布文件的数组$_FILE
;
这里是控制器函数的代码,它接收上传表单POST:
$this->load->library('upload');
$this->upload->initialize($config); //$config is array like as [in CI's documentation][1]
$path='uploads/some_folder'; // refers to the root's uploads/some_folder folder
$upload_data = $this->upload->multiFileUpload($path, TRUE);
魔法位于我从其他人处获得的multiFileUpload()
函数中。通过将它放在我的/ application / libraries文件夹中名为MY_Upload.php的文件中,可以在CI的上传库中扩展此功能。
以下是MY_Upload.php的全部内容,它实际上只是multiFileUpload()
函数,所以不要被吓到,除了$path
之外你不需要知道文件的位置去吧。
<?
class MY_Upload extends CI_Upload {
public function multiFileUpload($path, $protect = FALSE){
/*
* Declare uploaded_info and uploaded_files
* when i'm sure $_FILES has some data
*/
/* if($this->upload_path[strlen($this->upload_path)-1] != '/')
$this->upload_path .= '/';*/
//$this->upload_path=$path;
if(isset($_FILES)){
#Here we check if the path exists if not then create
/*if(!file_exists($this->upload_path)){
@mkdir($this->upload_path,0700,TRUE);
}*/
if(!file_exists($path)){
@mkdir($path,0700,TRUE);
}
$uploaded_info = FALSE;
/*
* The structure of $_FILES changes a lot with the array name on the input file,
* then i'm gonna modify $_FILES to make it think the data comes from several
* input file instead of one "arrayfied" input.
*
* The several ways to upload files are controled with this if...else structure
*/
if(count($_FILES) == 1)
{
$main_key = key($_FILES);
if(is_array($_FILES[$main_key]['name']))
{
foreach($_FILES[$main_key] as $key => $value)
{
for($y = 0; $y < count($value); $y++)
{
$_FILES[$main_key .'-'. $y][$key] = $value[$y];
}
}
unset($_FILES[$main_key]);
$uploaded_files = $_FILES;
}
else
{
$uploaded_files = $_FILES;
}
}
else
{
$uploaded_files = $_FILES;
}
#Here we create the index file in each path's directory
/*if($protect){
$folder = '';
foreach(explode('/',$this->upload_path) as $f){
$folder .= $f.'/';
$text = "<?php echo 'Directory access is forbidden.'; ?>";
if(!file_exists($folder.'index.php')){
$index = $folder.'index.php';
$Handle = fopen($index, 'w');
fwrite($Handle, trim($text));
fclose($Handle);
}
}
}*/
#Here we do the upload process
foreach($uploaded_files as $file => $value){
if (!$this->do_upload($file))
{
$uploaded_info['error'][] = array_merge($this->data(),
array('error_msg' => $this->display_errors()));
}
else
{
$uploaded_info['upload_data'][] = array_merge($this->data(),
array('error_msg' => $this->display_errors()));
}
}
}
#Then return what happened with the files
return $uploaded_info;
}
}