我正在尝试重命名图像文件并将文件位置保存在数据库中。我有问题,因为我想将文件命名为我插入的表行的id。 上传和插入后我想看到我的表格如下:
----------------------------------------
| id | name | category | image |
----------------------------------------
| 1 | foo | category | uploads/1.jpg |
----------------------------------------
id字段自动递增。 这是我的代码:
function service()
{
$con=$this->do_upload();
$id=mysql_insert_id();
$data=array(
'name'=>$this->input->post('name'),
'category'=>$this->input->post('category'),
'image'=>'uploads/'.$id.$con['file_ext'];
);
$query=$this->db->insert('table',$data);
return $query;
}
这不是正确的方法,并且假设文件没有按照需要保存在数据库中。而不是将其保存为'uploads / 1.jpg',它将保存为'uploads / 0.jpg'。
任何人都可以为我提供正确的约定吗?
注:我正在使用 codeigniter 2.1.0 和 mySQL 数据库。
答案 0 :(得分:4)
以前不调用mysql查询就无法使用mysql_insert_id
访问id。您必须插入新记录然后更新它。用新文件名。
编辑:
当我将图像/其他文件上传到服务器时,我总是用一些随机哈希重命名它们。所以文件在文件系统上有唯一的哈希名称,在mysql行中只设置了这个哈希来将db行与文件关联起来。
因此,在将新记录插入db之前,生成一些随机字符串,并检查具有此名称的文件是否已存在:
$filename = '';
do {
$filename = substr(md5(uniqid(rand(), true)), 0, 8);
} while ( !file_exists('uploads/'.$filename) );
在do_upload
方法中执行,并让它在$con
数组中返回文件名。
答案 1 :(得分:1)
如果您只为id
字段使用唯一值,则可以这样做:
function update_service($id)
{
$con=$this->do_upload();
$result = mysql_query("SELECT MAX(id) FROM <table_name>");
$data = mysql_fetch_row($result);
$id = $data[0] + 1;
$data=array(
'name'=>$this->input->post('name'),
'category'=>$this->input->post('category'),
'image'=>'uploads/'.$id.$con['file_ext'];
);
$query=$this->db->insert('table',$data);
return $query;
}
答案 2 :(得分:1)
function service()
{
$con=$this->do_upload();
$id = time();
$data=array(
'name'=>$this->input->post('name'),
'category'=>$this->input->post('category'),
'image'=>'uploads/'.$id.$con['file_ext'];
);
$query=$this->db->insert('table',$data);
return $query;
}
使用time()
而不是mysql_insert_id ..那么你只需要在do_upload()
函数中做同样的事情..它要求文件名使用time()
。
答案 3 :(得分:0)
我在其中一个应用中内置了相同的功能。我正在使用我从这里下载的uuid生成器类:https://github.com/Repox/codeigniter-uuid。
使用这个类我为新上传的图像生成uuid,然后将文件名设置为“.ext”。我将uuid存储在数据库字段中,也用于已上载图像的用户以获得对文件名的引用。
这对我来说非常好。
所以代码片段如下所示:
$this->load->library('uuid');
$uuid = $this->uuid->v4();
$new_file_name = $uuid.$image_data['file_ext'];
希望这有帮助。
祝你好运 塞巴斯蒂安