我正在使用WAMP服务器,我想使用CI在数据库中上传图像。数据库中的图像变量是blob数据类型。我的问题如下:
1)如何存储图像而不是文件名以及我应该使用哪些数据类型?
2)如何从数据库中检索图像?
我的控制器代码:
<?php class Image_control extends CI_Controller{
function index()
{
//$this->load->view('image_view');
//$this->Image_model->do_upload();
$data['images']=$this->Image_model->get_images();
$this->load->view('image_view',$data);
}
function do_upload()
{
$config = array(
'allowed_types' => 'jpg|png|bmp',
'upload_path'=>'./images1/',
'max_size'=>2000
);
$this->load->library('upload',$config);
if (!$this->upload->do_upload()) {
$errors[]=array('error'=>$this->upload->display_errors());
$this->load->view('image_view',$errors);
}
$image_path=$this->upload->data();
$file_name=$image_path['file_name'];
$config = array(
'a_name' => $this->input->post('a_name'),
'a_details'=>$this->input->post('a_info'),
'a_photo'=>$file_name
);
$insert=$this->db->insert('animalstore',$config);
return $insert;
}
}
?>
我的模特代码:
<?php class Image_model extends CI_Model {
function get_images()
{
$query = $this->db->get('animalstore');
if($query->num_rows > 0 )
{
foreach($query->result() as $rows)
{
$data[] = $rows;
}
return $data;
}
}
}
?>
最后这是我的观点的代码:
<?php
echo form_open_multipart('image_control/do_upload');
echo form_input('a_name','Animal Name');
echo form_input('a_info','Animal Information');
echo form_upload('userfile');
echo form_submit('upload','Upload');
echo form_close();
?>
<?php foreach ($images as $image):?>
<h1><?php echo $image->a_name;?></h1>
<h1><?php echo $image->a_details;?></h1>
<img src = "/<?php// echo ltrim($image->a_photo, '/'); ?>" >
<img src="http://localhost/ci_test/images1/<?php echo $image->a_photo;?>"/>
<img src="<?php //echo sprintf("images/%s", $image['screenshot']);?>" />
<h1><?php// echo $image->a_photo;?></h1>
<?php endforeach; ?>
我尝试用不同的方式解决它并搜索我的问题,但我没有找到任何合适的答案。
答案 0 :(得分:5)
不要存储数据库内的文件!
这总是一个糟糕的设计理念。将文件存储在文件系统中,只需存储文件名并指向文件,这将为您节省很多麻烦。
答案 1 :(得分:2)
// uploading
public function do_upload(){
...
$image_path=$this->upload->data();
$uploaded_image = $image_path['full_path'];
// Read the file
$fp = fopen($uploaded_image, 'r');
$data = fread($fp, filesize($uploaded_image));
$data = addslashes($data);
fclose($fp);
// here you can easy insert $data to 'a_photo' column.
}
// Viewing, $image_id is row id
public function getImage($image_id){
// select $row from database as usual and then
$content = $row['a_photo'];
echo '<img src="data:image/jpeg;base64,'.base64_encode($content).'">';
}
在你的模板中:
<?php getImage(12); ?>
其中12是行ID。
答案 2 :(得分:0)
试试这段代码
模型代码
function do_upload() {
$config = array(
'allowed_types' => 'jpg|png|bmp',
'upload_path'=>'./images1/', //make sure you have this folder
'max_size'=>2000
);
$this->load->library('upload',$config);
if ($this->upload->do_upload()) {
echo "Upload success!";
} else {
echo "Upload failed!";
}
$image_data = $this->upload->data();
}
function get_images()
{
$query = $this->db->get('animalstore');
return $query;
}
function Save_gallery($in)
{
$save=$this->db->insert('animalstore',$in);
return $save;
}
控制器代码
function index()
{
$this->load->model('Image_control'); //call a models
if ($this->input->post('upload')) {
$in=array();
$in['a_name'] = $this->input->post('a_name'),
$in['a_details'] = $this->input->post('a_info'),
$in['a_photo']=$_FILES['userfile']['name'];
if($this->Image_model->do_upload()) {
echo $this->upload->display_errors();
}else {
$this->Image_model->Save_gallery($in);
header('location:index');
}
$data['images']=$this->Image_model->get_images();
$this->load->view('image_view',$data);
}
视图
<?php
echo form_open_multipart('image_control/index');
echo form_input('a_name','Animal Name');
echo form_input('a_info','Animal Information');
echo form_upload('userfile');
echo form_submit('upload','Upload');
echo form_close();
?>
<?php foreach ($images as $image):?>
<h1><?php echo $image['a_name'];?></h1>
<h1><?php echo $image['a_details'];?></h1>
<?php echo '<img src ="'. base_url().'images1/'.$image['a_photo'].'" >";
endforeach; ?>
答案 3 :(得分:0)
这是我用于小型PNG缩略图的快速内容。 它们存储在名为&#34; coreg&#34;的表中。在名为&#34; IMAGE&#34;的字段中。字段类型是LONGBLOB。每次上传都会覆盖上一张图片。在实际应用中,视图文件显示为iframe:
查看上传文件(当然,最好使用CI特定的表单标签,但是你明白了)
add_image.php:
Current image:
<img src='/media/png/coreg/<?=$coregID?>' />
<? if(isset($error)){ echo $error; }?>
<form method='post' enctype="multipart/form-data" action='add_image/<?=$coregID?>'>
<input name="userfile" type="file" class='vLink' />
<input name="submitbtn" type="submit" value=" upload & overwrite " class='eLink' />
</form>
控制器显示图像
更优雅的是使用视图而不是回声并将DB逻辑移动到模型中,但这显示了更好的功能恕我直言:
忽略原始
require_once dirname(__FILE__) . "/base.php";
class Media extends BaseController {
function __construct() {
parent::__construct();
}
function png($table,$id) {
$this->db->where('ID',$id);
$r = $this->db->get($table);
if($r->num_rows){
$r = $r->result_array();
header("Content-Type: image/png");
echo $r[0]['IMAGE'];
}
}
}
控制器上传图片:
function add_image($coregID){
$data['coregID'] = $coregID;
$data['error'] = '';
if(isset($_POST['submitbtn'])){
$config['upload_path'] = './assets/img/coreg/';
$config['allowed_types'] = 'png';
$config['max_size'] = '100';
$config['max_width'] = '350';
$config['max_height'] = '350';
$config['file_name'] = $coregID.".png";
if(file_exists($config['upload_path'].$config['file_name'])){
unlink($config['upload_path'].$config['file_name']);
}
$this->load->library('upload', $config);
if ( ! $this->upload->do_upload()){
$data['error'] = $this->upload->display_errors();
} else {
$this->upload->data();
// now move the image into the DB
$fp = fopen($config['upload_path'].$config['file_name'], 'r');
$data = fread($fp, filesize($config['upload_path'].$config['file_name']));
$this->db->where('ID',$coregID);
$this->db->update('COREG',array('IMAGE' =>$data));
fclose($fp);
// optionally delete the file from the HD after this step
//unlink($config['upload_path'].$config['file_name']);
}
}
$this->load->view("add_image", $data);
}
答案 4 :(得分:0)
尝试此代码 控制器:-
<?php
class Profile extends CI_Controller {
public function __construct()
{
parent::__construct();
$this->load->helper(array('form', 'url'));
}
public function index()
{
$this->load->view('profile', array('error' => ' ' ));
}
function do_upload(){
$config['upload_path'] = './uploads/';
$config['allowed_types'] = 'gif|jpg|png';
$this->load->library('upload', $config);
if ( ! $this->upload->do_upload())
{
$error = array('error' => $this->upload->display_errors());
$this->load->view('profile', $error);
}
else
{
$data = $this->upload->data();
$data['img']=base_url().'./uploads/'.$data['file_name'];
$image['profile_pic'] = $data['file_name'];
$this->db->insert('user_profile_pic', $image);
$this->load->view('profile', $data);
}
}
}
答案 5 :(得分:0)
视图:
<?php echo form_open_multipart('profile/do_upload');?>
<input type="file" name="userfile" size="20" />
<br /><br />
<input type="submit" value="upload" />
<img src="<?php echo $img ?>" width="300px" height="300px">
</form>
?>