使用codeigniter上传时“没有选择要上传的文件”

时间:2011-09-17 19:10:42

标签: php codeigniter file-upload

我试图上传图片,但它总是给我“你没有选择要上传的文件。”

我的控制器

function add()
{

        $thedate=date('Y/n/j h:i:s');
        $replace = array(":"," ","/");
        $newname=str_ireplace($replace, "-", $thedate);

        $config['upload_path'] = './upload/';
        $config['allowed_types'] = 'gif|jpg|png|jpeg';
        $config['file_name']=$newname;
        $config['max_size'] = '100';
        $config['max_width']  = '1024';
        $config['max_height']  = '768';

        $this->load->library('upload', $config);
        //$this->upload->initialize($config);
        $this->load->library('form_validation');

        $this->form_validation->set_rules('title','title','trim|required');
        $this->form_validation->set_rules('description','Description','trim|required');
        $image1=$this->input->post('image');


     if ($this->form_validation->run()==FALSE){

            $this->addview();   

            return false;

        }


      if (!$this->upload->do_upload($image1)) {

        $error = array('error' => $this->upload->display_errors());
        $this->load->view('upload_error', $error);


         }

       else {
        $mage=$this->upload->do_upload($image1);

            $data =array(
            'title'=>$this->input->post('title'),
            'descrip'=>$this->input->post('description'),

            'image' => $mage['file_name']

    );  


            $this->load->model('member_functions');

            $q=$this->member_functions->insert($data);
    }}

设置了所有文件要求和文件权限,但我仍然得到了那个错误。谁能告诉我我做错了什么

5 个答案:

答案 0 :(得分:22)

$this->upload->do_upload()函数的参数应该是表单字段的名称。 (如果你调用它而不使用参数userfile将被使用)。在你的情况下,它似乎应该是'形象'。而不是:

$image1=$this->input->post('image');

它应该是:

$image1='image';

答案 1 :(得分:6)

  • 查看页面

表单标记应包含enctype="multipart/form-data" 即    <form action='' method=''enctype="multipart/form-data> <input type='file' name='field_name'/>

  • 控制器

并且在控制器上传代码中应为$this->upload->do_upload("field_name")
和jsut通过像

那样打印来检查文件是否到达服务器端
print_r($_FILES);

如果你得到空数组,那么确保客户端代码是正确的。

答案 2 :(得分:1)

我完全同意有关确保表单中文件元素的名称是userfile,或者如果不同,将其传递给do_upload方法的建议。但是,为了将来参考,还值得注意这一行:

$image1=$this->input->post('image');

之前

if (!$this->upload->do_upload($image1)) {

我发现post类的input方法在调用do_upload方法之后才返回任何内容。此外,您已在if语句中调用它,因此您无需在else子句中再次调用它。致电do_upload后,您现在可以访问包含$this->input->post的表单元素以及有关$this->upload->data()的上传文件的信息

答案 3 :(得分:1)

确保使用

  

form_open_multipart()

如果您使用表单助手。

答案 4 :(得分:0)

这是一个非常熟悉的问题。

我要将我的答案添加为我发现here的另一个答案的更全面的解释。我提交的代码不是不同的代码,而是添加了他的答案中未提及的一些行和细节。

即使看起来他的回答在技术上是正确的,也许他上面的答案也以他们自己的方式正确,但他们并没有为我工作。我不得不研究这个问题来找出真正发生的事情,并且我对这个过程有了足够的了解,以了解如何编写我自己的解决方案。

首先,请参阅Nana Partykar的评论,&#34;在您的控制器中,我无法看到任何is_uploaded_file()函数?&#34;该评论告诉我们,人们误解了两个名称相似但文件不同的文件。我知道,因为有一段时间我认为他们必须引用同一个文件,控制器文件(名为&#34; Uploader.php&#34;)。我可以看到几乎所有这些问题都引用了相同的#34;如何使用Ajax上传多个文件&#34;那里的教程,我自己的版本,包括在内。我们所使用的代码完全相同。

但是,控制器文件是&#34; Uploader.php&#34;。你看到$ this-&gt; upload-&gt; do_upload()或$ this-&gt; upload-&gt; do_upload(&#39; userfile&#39;)甚至$ this-&gt; upload-&gt; do_upload(& #39;文件&#39;),这是指名为&#34; Upload.php&#34;的系统/库模块文件。请注意,在调用do_upload()函数之前,您必须调用以下行:$ this-&gt; load-&gt; library(&#39; upload&#39;,$ config);

Sachin Marwha给了我们一个for循环,循环遍历$ _FILES [&#39; userfile&#39;]数组。我们假设你上传了三张照片。每个$ _FILES [&#39; userfile&#39;]元素本身由5&#34;属性&#34;:name,type,tmp_name,error,size组成。您可以在PHP上看到这些$ _FILE属性。

您只想一次将一个文件传递给do_upload()。您不希望一次将所有三个(甚至20个)文件传递给do_upload。这意味着在调用do_upload()之前,必须将$ _FILES [&#39; userfile&#39;]数组分解为单个文件。为此,我创建$ _FILES数组的$ _FILES [&#39; f&#39;]元素。我通过在do_upload($ file =&#39; userfile&#39;)函数中设置system / library / Upload.php文件中的断点来解决这个问题,看看我在哪里得到臭名昭着的“没有选择文件上传“每个人(包括我自己)一直在抱怨。您会发现,该函数使用表单发送给控制器的原始$ _FILES数组。但它实际上只使用表单中输入type = file的名称。如果您没有告诉它表单输入的名称,它将默认为$ _FILES [&#39; userfile&#39;]。事实证明,这是我最大的问题,因为如果我使用输入字段的名称,那么该字段传递数组或文件集合,而不仅仅是单个文件。所以我必须制作一个特殊的$ _FILES [&#39; f]元素,并且只传递$ _FILES [&#39; f&#39;]。

这就是我这样做的方式,相信我,我尝试了本页面上的所有版本以及其他版本,不仅仅是一个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');
    }        

在for i循环中取消设置$ config数组,然后重新创建$ config数组,这就是为每个图片文件制作缩略图图像的部分。

完整的控制器上传功能:

    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);
    }