переименование имени файла по id - PullRequest
1 голос
/ 13 февраля 2012

Я пытаюсь переименовать файл изображения и сохранить местоположение файла в базе данных. У меня проблема с этим, так как я хочу назвать файл идентификатором строки таблицы, в которую я вставляю. после загрузки и вставки я хочу видеть свою таблицу следующим образом:

----------------------------------------
| 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 ]

4 голосов
/ 13 февраля 2012

Вы не можете получить доступ к идентификатору с mysql_insert_id без вызова запроса MySQL ранее.Вы должны вставить новую запись, а затем обновить ее.с новым именем файла.

Редактировать:

Когда я загружал изображения / другие файлы на сервер, я всегда переименовывал их со случайным хэшем.Таким образом, файлы имели уникальное хеш-имя в файловой системе, и в строке mysql был установлен именно этот хеш, чтобы связать строку БД с файлом.

Поэтому, прежде чем вставлять новую запись в БД, сгенерируйте случайную строку с проверкой, если файл с этим именемуже существует:

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

Сделайте это в методе do_upload и дайте ему возможность вернуть имя файла в массиве $con.

1 голос
/ 13 февраля 2012
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().

1 голос
/ 13 февраля 2012

Если вы просто используете уникальное значение для поля 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;
}
0 голосов
/ 16 февраля 2012

Я встроил такую ​​же функциональность в одно из моих приложений.Я использую класс генератора 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'];

Надеюсь, это поможет.

С уважением, Себастьян

...