Php CodeIgniter多文件上载不工作
我正在尝试上载文件夹中的多个文件,但出现错误“您没有选择要上载的文件。”Php CodeIgniter多文件上载不工作,php,codeigniter,upload,Php,Codeigniter,Upload,我正在尝试上载文件夹中的多个文件,但出现错误“您没有选择要上载的文件。” 遇到一个PHP错误 严重性:警告 消息:is_uploaded_file()要求参数1为字符串、数组 给定 文件名:libraries/Upload.php 电话号码:412 回溯: 文件:C:\wamp\www\mshaadi\application\controllers\Email.php行:55 功能:上传 文件:C:\wamp\www\mshaadi\index.php行:293函数:require\u一次 控制
遇到一个PHP错误 严重性:警告 消息:is_uploaded_file()要求参数1为字符串、数组 给定 文件名:libraries/Upload.php 电话号码:412 回溯: 文件:C:\wamp\www\mshaadi\application\controllers\Email.php行:55 功能:上传 文件:C:\wamp\www\mshaadi\index.php行:293函数:require\u一次 控制器
$conf['upload_path'] = './images';
$conf['allowed_types'] = 'doc|docx|pdf|jpg|gif|jpeg|png';
$conf['max_size'] = '9999000';
$conf['max_width'] = '1024';
$conf['max_height'] = '768';
$conf['overwrite'] = TRUE;
$this->load->library('upload');
foreach ($_FILES as $fieldname => $fileObject){
$this->upload->initialize($conf);
if (!empty($fileObject['name'])){
if (!$this->upload->do_upload($fieldname)){
$error = $this->upload->display_errors();
print_r($error);
}else{
print_r("done");
}
}else {
print_r("no");
}
}
查看
<div class="form-group col-md-12">
<label for="Attach"><strong>Add Attachment</strong><br></label>
<input type="file" class="btn btn-default btn-file" name="atta[]" id="Attach" multiple="multiple">
</div>
添加附件
像这样试试
function upload_files()
{
$config = array();
$config['upload_path'] = './Images/';
$config['allowed_types'] = 'gif|jpg|png';
$config['max_size'] = '0';
$config['overwrite'] = FALSE;
$this->load->library('upload');
$files = $_FILES;
for($i=0; $i< count($_FILES['userfile']['name']); $i++)
{
$_FILES['userfile']['name']= $files['userfile']['name'][$i];
$_FILES['userfile']['type']= $files['userfile']['type'][$i];
$_FILES['userfile']['tmp_name']= $files['userfile']['tmp_name'][$i];
$_FILES['userfile']['error']= $files['userfile']['error'][$i];
$_FILES['userfile']['size']= $files['userfile']['size'][$i];
$this->upload->initialize($config);
$this->upload->do_upload();
}
}
函数上传_文件()
{
$config=array();
$config['upload_path']='./Images/';
$config['allowed_types']='gif | jpg | png';
$config['max_size']='0';
$config['overwrite']=FALSE;
$this->load->library('upload');
$files=$\u文件;
对于($i=0;$iupload->initialize($config);
$this->upload->do_upload();
}
}
这正在工作
function do_upload()
{
$this->load->library('upload');
$files = $_FILES;
$cpt = count($_FILES['userfile']['name']);
for($i=0; $i<$cpt; $i++)
{
$_FILES['userfile']['name']= $files['userfile']['name'][$i];
$_FILES['userfile']['type']= $files['userfile']['type'][$i];
$_FILES['userfile']['tmp_name']= $files['userfile']['tmp_name'][$i];
$_FILES['userfile']['error']= $files['userfile']['error'][$i];
$_FILES['userfile']['size']= $files['userfile']['size'][$i];
$this->upload->initialize($this->set_upload_options());
$this->upload->do_upload();
}
}
private function set_upload_options()
{
//upload an image options
$config = array();
$config['upload_path'] = './Images/';
$config['allowed_types'] = 'gif|jpg|png';
$config['max_size'] = '0';
$config['overwrite'] = FALSE;
return $config;
}
函数do_upload()
{
$this->load->library('upload');
$files=$\u文件;
$cpt=计数($_文件['userfile']['name']);
对于($i=0;$iupload->initialize($this->set_upload_options());
$this->upload->do_upload();
}
}
私有函数集\上传\选项()
{
//上载图像选项
$config=array();
$config['upload_path']='./Images/';
$config['allowed_types']='gif | jpg | png';
$config['max_size']='0';
$config['overwrite']=FALSE;
返回$config;
}
我将添加我的答案,作为对@SachinMarwa自己答案的更全面解释。我提交的代码不是不同的代码,而是添加了一些他答案中未提及的行和细节
尽管看起来他的答案在技术上是正确的,也许他上面的答案在他们自己的方式上也是正确的,但这些答案对我来说并不适用。我必须研究这个问题以找出真正的问题所在,我对这个过程有了足够的了解,以理解如何编写自己的解决方案
首先,请参考Nana Partykar的评论,“在您的控制器中,我看不到任何is_uploaded_file()函数?”该评论告诉我们,人们误解了两个名称相似但不同的文件。我知道,因为有一段时间我认为它们一定是指同一个文件,控制器文件(名为“Uploader.php”)。我可以看到几乎所有这些问题都涉及到相同的“如何使用Ajax上载多个文件”教程,包括我自己的版本。我们使用的代码完全相同
但是,控制器文件是“Uploader.php”。当您看到$this->upload->do_upload()或$this->upload->do_upload('userfile')甚至$this->upload->do_upload('files')时,这是指一个名为“upload.php”的系统/库模块文件。请注意,在调用do_upload()函数之前,必须调用这一行:$this->load->library('upload',$config)
Sachin Marwha给了我们一个for循环,它在$\u FILES['userfile']数组中循环。假设您上载了三张图片。每个$\u FILES['userfile']元素本身由5个“属性”组成:名称、类型、tmp\u名称、错误、大小。您可以在上看到这些$\u文件属性
您一次只想传递一个文件以进行上传()。您不想一次传递所有三个(甚至20个)文件以进行上传。这意味着您必须在调用do\u upload()之前将$\u files['userfile']数组分解为各个文件。为此,我制作了一个$\u files['f']元素。我通过在system/library/Upload.php文件中的do_Upload($file='userfile')函数中设置断点来解决这个问题,以查看我从何处得到了大家(包括我自己)都知道的臭名昭著的“没有选择要上传的文件”不断抱怨。您会发现,该函数使用表单发送给控制器的原始$\u文件数组。但它实际上只使用表单中输入类型=文件的名称。如果您不告诉它表单输入的名称,它将默认为$\u文件['userfile']。事实证明,这是我最大的问题,因为如果我使用输入字段的名称,那么该字段传递的是一个数组或一组文件,而不仅仅是一个文件。因此,我必须生成一个特殊的$u files['f]元素,并且只传递$u files['f']
以下是我的做法,相信我,我尝试了本页面和其他页面上的所有版本,不仅仅是一个StackOverflow,还有其他教程:
$cpt = count($_FILES['userfile']['name']);
for($i=0; $i < $cpt; $i++)
{
unset($config);
$config = array();
$config['upload_path'] = $path;
$config['allowed_types'] = 'gif|jpg|png';
$config['max_size'] = '1000';
$config['overwrite'] = TRUE;
$config['remove_spaces'] = FALSE;
$config['file_name'] = $_FILES['userfile']['name'][$i];
// Create a new 'f' element of the $_FILES object, and assign the name, type, tmp_name, error, and size properties to the corresponding 'userfile' of this iteration of the FOR loop.
$_FILES['f']['name'] = $_FILES['userfile']['name'][$i];
$_FILES['f']['type'] = $_FILES['userfile']['type'][$i];
$_FILES['f']['tmp_name'] = $_FILES['userfile']['tmp_name'][$i];
$_FILES['f']['error'] = $_FILES['userfile']['error'][$i];
$_FILES['f']['size'] = $_FILES['userfile']['size'][$i];
$this->load->library('upload', $config);
$this->upload->initialize($config);
if (! $this->upload->do_upload('f'))
{
$data['errors'] = $this->upload->display_errors();
}
else
{
$data['errors'] = "SUCCESS";
}
unset($config);
$config = array();
$config['image_library'] = 'gd2';
$config['source_image'] = $path . $_FILES['userfile']['name'][$i];
$config['create_thumb'] = TRUE;
$config['maintain_ratio'] = TRUE;
$config['thumb_marker'] = '.thumb';
$config['width'] = 100;
$config['height'] = 100;
$this->load->library('image_lib', $config);
$this->image_lib->clear();
$this->image_lib->initialize($config);
$this->image_lib->resize();
$types = array('.jpg');
}
$cpt=count($_FILES['userfile']['name']);
对于($i=0;$i<$cpt;$i++)
{
未设置($配置);
$config=array();
$config['upload_path']=$path;
$config['allowed_types']='gif | jpg | png';
$config['max_size']='1000';
$config['overwrite']=TRUE;
$config['remove_spaces']=FALSE;
$config['file\u name']=$\u FILES['userfile']['name'][$i];
//创建$_FILES对象的新“f”元素,并将名称、类型、tmp_名称、错误和大小属性分配给FOR循环此迭代的相应“userfile”。
$\u文件['f']['name']=$\u文件['userfile']['name'][$i];
$\u文件['f']['type']=$\u文件['userfile']['type'][$i];
$\u文件['f']['tmp\u名称]]=$\u文件['userfile']['tmp\u名称][$i];
$\u-FI
public function upload_asset_photo()
{
$data = array();
$dateArray = explode("/",$this->input->post('date'));
$date = $dateArray[2] . "/" . $dateArray[0] . "/" . $dateArray[1]; // year/month/day
$cid = $this->config->item('cid'); // this is a special company id I use, unnecessary to you guys.
$padded_as_id = sprintf("%010d", $this->uri->segment(3)); // this makes an "asset id" like "3" into "0000000003"
$path = 'properties_/' . $padded_as_id . '/' . $date . '/'; // file path
if (!is_dir($path)) {
mkdir($path,0755,true); //makes the ile path, if it doesn't exist
}
$cpt = count($_FILES['userfile']['name']);
for($i=0; $i < $cpt; $i++)
{
unset($config);
$config = array();
$config['upload_path'] = $path;
$config['allowed_types'] = 'gif|jpg|png';
$config['max_size'] = '1000';
$config['overwrite'] = TRUE;
$config['remove_spaces'] = FALSE;
$config['file_name'] = $_FILES['userfile']['name'][$i];
$_FILES['f']['name'] = $_FILES['userfile']['name'][$i];
$_FILES['f']['type'] = $_FILES['userfile']['type'][$i];
$_FILES['f']['tmp_name'] = $_FILES['userfile']['tmp_name'][$i];
$_FILES['f']['error'] = $_FILES['userfile']['error'][$i];
$_FILES['f']['size'] = $_FILES['userfile']['size'][$i];
$this->load->library('upload', $config);
$this->upload->initialize($config);
if (! $this->upload->do_upload('f'))
{
$data['errors'] = $this->upload->display_errors();
}
else
{
$data['errors'] = "SUCCESS";
}
unset($config);
$config = array();
$config['image_library'] = 'gd2';
$config['source_image'] = $path . $_FILES['userfile']['name'][$i];
$config['create_thumb'] = TRUE;
$config['maintain_ratio'] = TRUE;
$config['thumb_marker'] = '.thumb';
$config['width'] = 100;
$config['height'] = 100;
$this->load->library('image_lib', $config);
$this->image_lib->clear();
$this->image_lib->initialize($config);
$this->image_lib->resize();
$types = array('.jpg');
}
header('Content-Type: application/json');
echo json_encode($data);
}
public function add()
{
$config = array();
$config['upload_path'] = './assets/uploaded_images';
$config['allowed_types'] = 'gif|jpg|png';
$config['max_size'] = '10000';
$this->load->library('upload');
$image_names = array();
$files = $_FILES;
if (isset($_FILES['images'])) {
for ($i = 0; $i < count($_FILES['images']['name']); $i++) {
$_FILES['image']['name'] = $files['images']['name'][$i];
$_FILES['image']['type'] = $files['images']['type'][$i];
$_FILES['image']['tmp_name'] = $files['images']['tmp_name'][$i];
$_FILES['image']['error'] = $files['images']['error'][$i];
$_FILES['image']['size'] = $files['images']['size'][$i];
$this->upload->initialize($config);
$image_names[$i] = $_FILES['image']['name'];
$this->upload->do_upload('image');
}
$data1['images'] = implode(',', $image_names);
$data1['productId'] = $this->input->post('productId');
$image_id = $this->Image_model->add_image($data1);
redirect('image/index');
} else {
$error = array('error' => $this->upload->display_errors());
$this->load->model('Product_model');
$data['all_products'] = $this->Product_model->get_all_products();
$data['error'] = $error;
$data['_view'] = 'image/add';
$this->load->view('layouts/main', $data);}
}