php 如何使用 CodeIgniter 在数据库中存储和检索图像
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/17223945/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
how to store and retrieve images in database using CodeIgniter
提问by brijeshp09
I am using a WAMP server, and I want to upload images in the database using CI.The image variable in database is of blob datatype. My question's as follows:
我正在使用 WAMP 服务器,我想使用 CI 上传数据库中的图像。数据库中的图像变量是 blob 数据类型。我的问题如下:
1) How to store the image instead of the file name and what datatypes should I use?
1)如何存储图像而不是文件名以及我应该使用什么数据类型?
2) How to retrieve images from the DB?
2) 如何从数据库中检索图像?
My controller's code:
我的控制器代码:
<?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;
}
}
?>
My model's code:
我的模型代码:
<?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;
}
}
}
?>
And finally here's the code for my view:
最后这里是我的观点的代码:
<?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; ?>
I tried solving it in different ways and searched for my problem but I didn't find any appropriate answer.
我尝试以不同的方式解决它并搜索我的问题,但我没有找到任何合适的答案。
回答by TravisO
DO NOT STORE FILES INSIDE THE DATABASE!!!
不要在数据库中存储文件!!!
This is always a bad design idea. Store the files in the file system and simply store the file names and point to the file, it will save you a lot of headaches in the future.
这总是一个糟糕的设计理念。将文件存储在文件系统中,只需存储文件名并指向该文件,以后会为您省去很多麻烦。
回答by ToxaBes
// 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).'">';
}
In your template:
在您的模板中:
<?php getImage(12); ?>
where 12 is row id.
其中 12 是行 ID。
回答by Rachmat Yanuarsyah
try this code
试试这个代码
models code
型号代码
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;
}
controller code
控制器代码
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);
}
view
看法
<?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; ?>
回答by Rid Iculous
Here's a quick something I use for small PNG thumbnails. These are stored in a table called "coreg" in a field named "IMAGE". The field-type is LONGBLOB. Every upload overwrites the previous image. In the actual app the view-file is displayed as an iframe:
这是我用于小型 PNG 缩略图的快速工具。它们存储在名为“IMAGE”的字段中名为“coreg”的表中。字段类型是 LONGBLOB。每次上传都会覆盖之前的图像。在实际应用中,视图文件显示为 iframe:
VIEW FILE FOR UPLOADING (better to use the CI specific form tags of course, but you get the idea)
VIEW FILE FOR UPLOADING(当然最好使用 CI 特定的表单标签,但你明白了)
add_image.php:
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>
CONTROLLER TO SHOW THE IMAGE
显示图像的控制器
More elegant would be to use a view instead of the echo and to move the DB logic into the model, but this shows the functionality better IMHO:
更优雅的是使用视图而不是回声并将数据库逻辑移动到模型中,但这显示了更好的功能恕我直言:
media.php
媒体.php
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'];
}
}
}
CONTROLLER TO UPLOAD THE 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);
}