【问题标题】:How to add file names from all uploaded images to database in Codeigniter?如何将所有上传图像的文件名添加到 Codeigniter 中的数据库?
【发布时间】:2023-04-06 13:34:01
【问题描述】:

我制作了一个上传脚本来上传多张图片。这很好用,但我想将文件名添加到数据库中。

我的问题是只有最后上传的图片被添加到数据库中。 这是因为我不知道如何将数据数组从控制器传递给模型。

我要上传的代码如下所示(控制器):

public function aanbiedingenadd() //functie om ze toe te voegen aan de database
{       
    $files = $_FILES;
    echo '<pre>';
    print_r($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();
        $image_data = $this->upload->data();
    }
    print_r($image_data);
    print_r($this->upload->display_errors());
    $this->aanbieding_model->addaanbieding($image_data);
    redirect("members/aanbiedingen");
}

print_r($files) 显示所有上传的文件及其大小、宽度、高度等。

print_r($image_data); 只显示最后上传的图片。

我的模型如下所示:

        $insert_data = array(
            'fotonaam' => $image_data['file_name']
        );
        print_r($insert_data);
        die;
        $input = $this->input->post('userfile');
        if(isset($input)){
            $this->db->insert('fotoaanbiedingen', $insert_data);
        }else{
            return FALSE;
        }

print_r($insert_data); 给我看

Array
(
    [fotonaam] => 'nameoflastuploadedimage'
)

如何将其添加到数组中并逐个添加?

【问题讨论】:

    标签: php mysql image codeigniter upload


    【解决方案1】:

    把这行放在for loop里面:

    $this->aanbieding_model->addaanbieding($image_data);
    

    【讨论】:

    • 现在只显示print_r($image_data);上传的第一张图片
    • 好的,这解决了问题,但现在我必须编辑我的模型,以便为相同的 aanbieding 添加图像。它为每个图像添加一个新行。我希望这些图像仅适用于 1 个 aanbieding。
    • “表格里面有什么”不应该比这个数组里面有什么更重要吗?但只是为了澄清:每次调用 for 循环时,$image_data 都会被 upload_data() 覆盖。所以很自然地,你只会看到这个数组中的最后一个图像。也许您应该重新了解基本的数组内容:php.net/manual/en/language.types.array.php
    【解决方案2】:

    $this-&gt;aanbieding_model-&gt;addaanbieding($image_data); 移动到你的 for 循环中,基本上就是这样。

    如果你上传了很多图片,你可能应该使用一个数组来收集所有的图片数据,然后在你的模型中使用insert_batch()

    例如在您的控制器中:

    $images = array();
    $files = $_FILES;
    $cpt = count($_FILES['userfile']['name']);
    for($i=0; $i<$cpt; $i++)
    {
      // your upload routine here
      $images[] = $this->upload->data();
    }
    
    $this->aanbieding_model->addaanbieding($images);
    

    在您的模型中,您将使用 $this-&gt;db-&gt;insert_batch('fotoaanbiedingen', $insert_data); 而不仅仅是插入。

    希望有帮助!

    【讨论】:

    • 您的示例显示 $this->aanbieding_model->addaanbieding($images);在 for 循环之外。
    • 是的,这个例子是为了说明模型中'insert_batch'的用法。不同之处在于,在 for 循环中移动模型调用(带有插入)将为每个上传的文件获得 1 个查询,而“insert_batch”只为所有上传的文件创建 1 个查询。
    • 好的,它现在可以工作了,但是当我上传 3 张图片时,会创建 3 行,我想要用 3 张图片创建 1 行。 '我忘了说我用的是joined tables,所以1个aanbieding可以有更多的图片(应该是)
    • 那么您可能想开始另一个问题,因为这需要很多不同的背景信息才能正确完成,恕我直言。
    【解决方案3】:

    请做一个这样的 finction :-

    public function fileUpload(&$uploadFileData,$field)
    {
        $config1['allowed_types'] = 'gif|jpg|jpeg|png';
        $config1['upload_path']     = ABSOLUTEPATH.'category/original/';
        $config1['optional']        = true;
        $config1['max_size']        = '0';
        $config1['max_width']       = '00';
        $this->load->library('upload', $config1);
        if (!$this->upload->do_upload($field,true))
        {
            $error = array('error' => $this->upload->display_errors());
            $r = $error;
        }
        else
        {
            $data = array('upload_data' => $this->upload->data());
            $r = "sucess";
        }
        $uploadFileData[$field] = $this->upload->file_name;
        return $r;
    }
    

    然后这样称呼它:-

        $field = 'userfile';
        $uploadFileData = array();
        $uploadFileData[$field.'_err'] = '';
        $isUploaded = $this->fileUpload($uploadFileData,$field);
        if($isUploaded != "sucess")
         {
         echo "error";
        }
        else
        {
        $imagename = $uploadFileData[$field];
        }
    

    【讨论】:

    • 不改变整个代码你只需要改变 $this->upload->initialize($this->set_upload_options()); $this->upload->do_upload(); $image_data = $this->upload->data();
    猜你喜欢
    • 1970-01-01
    • 2013-04-17
    • 2020-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-07
    • 1970-01-01
    相关资源
    最近更新 更多