通过id重命名文件名

Sha*_*bib 1 php mysql file-upload codeigniter-2

我正在尝试重命名图像文件并将文件位置保存在数据库中。我遇到了问题,因为我想将文件命名为我要插入的表行的 id。上传并插入后,我想看到我的表,如下所示:

----------------------------------------
| id | name | category | image         |
----------------------------------------
| 1  | foo  | category | uploads/1.jpg |
----------------------------------------
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)

这不是正确的方法,并且假设文件没有按需要保存在数据库中。而不是将其保存为“uploads/1.jpg”,而是将其保存为“uploads/0.jpg”。
任何人都可以为我提供正确的约定来做到这一点吗?注意我正在使用codeigniter 2.1.0mySQL数据库。

hsz*_*hsz 5

mysql_insert_id如果之前没有调用 mysql 查询,则无法访问 id 。您必须插入新记录然后更新它。与新文件名。

编辑:

当我将图像/其他文件上传到服务器时,我总是用一些随机哈希重命名它们。因此,文件在文件系统上具有唯一的哈希名称,并且在 mysql 行中仅设置了此哈希来将数据库行与文件相关联。

因此,在将新记录插入数据库之前,生成一些随机字符串并检查具有该名称的文件是否已存在:

$filename = '';
do {
  $filename = substr(md5(uniqid(rand(), true)), 0, 8);
} while ( !file_exists('uploads/'.$filename) );
Run Code Online (Sandbox Code Playgroud)

在方法中执行此do_upload操作并让它以$con数组形式返回文件名。

  • hsz说的是对的。您需要将文件添加到文件系统,将记录添加到数据库。返回最后一个 ID #,然后重命名该文件,最后重新查询数据库以使用新文件名更新该行。 **建议** 将文件命名为时间戳,并将该时间戳存储在数据库中。少了一次对数据库的查询。并且同样独特。 (2认同)