按ID重命名文件名

时间:2012-02-13 13:28:55

标签: php mysql file-upload codeigniter-2

我正在尝试重命名图像文件并将文件位置保存在数据库中。我有问题,因为我想将文件命名为我插入的表行的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 数据库。

4 个答案:

答案 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'];

希望这有帮助。

祝你好运 塞巴斯蒂安