如何调整我的模型以将上传的图像存储到我的数据库作为图像的链接而不是显示为 blob?

Posted

技术标签:

【中文标题】如何调整我的模型以将上传的图像存储到我的数据库作为图像的链接而不是显示为 blob?【英文标题】:How do i adjust my model to stored uploaded images to my database as a link to the image instead of appearing as a blob? 【发布时间】:2012-11-12 07:36:56 【问题描述】:

大家好,我最近设法将图片上传到我的个人资料页面,但是当我刷新页面时,图片消失了。我认为这是因为图像是如何被放入数据库的。

这是型号:

function ProfileImages()

    parent::__construct();



function exists($username)

    $this->db->select('*')->from("profileimages")->where('user', $username);
    $query = $this->db->get();

    if ($query->num_rows() > 0)
    

        return true;
        /*
         echo "user $user exists!";
        $row = $query->row();
        echo " and his profileimage is $row->profileimage";
        */
    

    else

    

        return false;
        //echo "no such user as $user!";
    




function putProfileImage($username, $img)



    $record = array('user' => $username, 'profileimage' => $img);
    if ($this->exists($username))
    
        $this->db->where('user', $username)->update('profileimages', $record);

    
    else
    
        $this->db->where('user', $username)->insert('profileimages', $record);

    



function getProfileImage($username)

    $this->db->select('*')->from('profileimages')->where('user', $username);
    $query = $this->db->get();
    if ($query->num_rows() > 0)
        $row = $query->row();
        return $row->profileimage;
    

    return Null;




   

这是我的控制器:

class HomeProfile extends CI_Controller 
 


function HomeProfile()
  
   parent::__construct();
   $this->load->model("profiles");
   $this->load->model("profileimages");
   $this->load->helper(array('form', 'url'));
  


      function upload()
       
      $config = array(

        'allowed_types' =>'gif|jpg|jpeg|png',
        'upload_path' =>'./web-project-jb/assets/puploads/',
         'max_size' => 10000,
         'max_width' => 1024,
        'max_height' => 768

);


$this->load->library('upload', $config);
$img = $this->session->userdata('img');
$username = $this->session->userdata('username');
$this->profileimages->putProfileImage($username, $this->input->post("profileimage"));
//fail show upload form
if (! $this->upload->do_upload())


    $error = array('error'=>$this->upload->display_errors());

    $username = $this->session->userdata('username');


    $viewData['username'] = $username;
    $viewData['profileText'] = $this->profiles->getProfileText($username);

    $this->load->view('shared/header');
    $this->load->view('homeprofile/homeprofiletitle', $viewData);
    $this->load->view('shared/nav');
    $this->load->view('homeprofile/homeprofileview', $error, $viewData, array('error' => ' ' ));
    $this->load->view('shared/footer');

    //redirect('homeprofile/index');



else

    //successful upload so save to database


    $file_data = $this->upload->data();


    $data['img'] = '/web-project-jb/assets/puploads/'.$file_data['file_name'];
    // you may want to delete the image from the server after saving it to db
    // check to make sure $data['full_path'] is a valid path
    // get upload_sucess.php from link above
    //$image = chunk_split( base64_encode( file_get_contents( $data['file_name'] ) ) );



    $this->username = $this->session->userdata('username');

    $data['profileimages'] = $this->profileimages->getProfileImage($username);


    $viewData['username'] = $username;
    $viewData['profileText'] = $this->profiles->getProfileText($username);

    $username = $this->session->userdata('username');

    $this->load->view('shared/header');
    $this->load->view('homeprofile/homeprofiletitle', $viewData);
    $this->load->view('shared/nav');
    $this->load->view('homeprofile/homeprofileview', $data, $viewData);
    $this->load->view('shared/footer');


    //redirect('homeprofile/index');


  



  function index()
  

$username = $this->session->userdata('username');

$data['profileimages'] = $this->profileimages->getProfileImage($username);

$viewData['username'] = $username;
$viewData['profileText'] = $this->profiles->getProfileText($username);

$this->load->view('shared/header');
$this->load->view('homeprofile/homeprofiletitle', $viewData);
$this->load->view('shared/nav');
//$this->load->view('homeprofile/upload_form', $data);
$this->load->view('homeprofile/homeprofileview', $data, $viewData, array('error' => ' ' ) );
$this->load->view('shared/footer');
   

  

如果您查看模型中的 putprofileimages 函数,我想我会在此处某处放置一个 appends 命令。我希望图像的文件名出现在 profileimage 字段的数据库中。我也希望当我刷新时个人资料图像会留在屏幕上

<h3><?="Profile Image"?></h3>
 <img src="<?php if (isset($img)) echo base_url($img); ?>" width='300' height='300'/>
  <?=form_open_multipart('homeprofile/upload');?>
    <input type="file" name="userfile" value=""/>
    <?=form_submit('submit', 'upload')?>
    <?=form_close();?> 
    <?php if (isset($error)) echo $error;?>
  </div> 
</div>  
   <div id="secondary">
  <p>
      <?=$profileText;?>
    </p>
    <p>
      <?=form_open('homeprofile/changetext'); ?>
      <?php $msgbox = array(
            'name' => 'profiletext',
            'rows' => '8',
            'cols' => '30',
            );?>
     <?=form_textarea($msgbox);?>       
     </p>
     <p>
      <?=form_submit('submit', 'Change'); ?>
      <?=form_close(); ?>
    </p>
</div>

【问题讨论】:

为什么你会有一个 exists() 函数然后再次运行完全相同的查询来获取行?只需尝试获取该行并将其返回,如果这是错误的,则它不存在。保存了一个数据库连接。无论如何.. 【参考方案1】:

您可以像 char 字段一样简单地将图像名称保存在数据库中。 在您的 do_upload 函数之后,您可以使用 $this-&gt;upload-&gt;file_name 检索图像名称

然后您可以轻松地将其保存在数据库中,而不是整个文件。

现在在您的视图页面中,您可以通过 html 设置图像路径,然后仅附加您从 db 查询中获得的文件名。

【讨论】:

$this->upload->file_name - 我把它放在 do_upload 函数的 else 部分吗? 我还需要触摸我的模型还是只在视图中使用附加? 在 $this->upload->file_name 中有文件名。您需要将其传递给您的模型。示例:$data_for_model = array('username'=>$username, 'image'=> $this->upload->file_name);【参考方案2】:

一个简短的说明 - 你在使用 codeigniter 2 吗? 你应该这样设置你的构造函数:

 class HomeProfile extends CI_Controller 
 

 function __construct()

    // Call the parent construct
    parent::__construct();

$this->load->model("profiles");
$this->load->model("profileimages");
$this->load->helper(array('form', 'url'));      

  // end construct

模型也是如此! 好的,在你的模型中,也许我没有得到这个,但你有

 if ($this->exists($username))

但是你的方法说

 function putProfileImage($username, $img)

所以如果用户名可能为空,您只需设置一个默认值,如

function putProfileImage($username = 0, $img)

也许你可以这样做

 if ($username === 0)

但我个人不会将插入和更新放在同一个方法中,将它们分开, 调试起来会容易得多。 还有——你有没有在自动加载中加载会话库???

【讨论】:

您好,是的,我确实加载了会话库。如果没问题,我想将插入和更新放在同一个方法中,因为我发现这种方式更容易理解自己。我开始认为我在模型中拥有的第一个功能甚至是必要的吗?如果页面被刷新,我想我需要获取 profileimage 来在页面中显示图像。目前图像在我的数据库中显示为 0 - 这是在我将字段的数据类型从 Blob 更改为 char 之后。 顺便说一句,在更新命令中,我是否没有放置上传文件夹以便它可以引用它并将实际文件插入数据库?$this->db->where('user', $用户名)->update('profileimages', /*'./uploads/.' */$record); 本教程将帮助net.tutsplus.com/tutorials/php/…

以上是关于如何调整我的模型以将上传的图像存储到我的数据库作为图像的链接而不是显示为 blob?的主要内容,如果未能解决你的问题,请参考以下文章

反应本机图像获取/上传

是否有任何方法可以在将图像上传到我的 tkinter fyi 窗口之前为用户提供调整图像大小的选项

将图像从GitHub上传到WordPress网站

我想将图像 URL 作为 json 数据上传到我的 Angular 表单并将其发送到服务器。图片 URL 来自服务器响应

如何在 react 中使用 graphene-django 和 axios 将图像上传到我的服务器?

考虑到我的图像的链接存储在 MySQL 数据库中,如何通过 php 显示存储在文件夹中的图像