Как заменять загружаемый файл каждый раз на новый файл с учётом не заменяя файлы других пользователей?
Вот контроллер, сейчас файлы можно бесконечно загружать, а надо, чтобы загружаемый файл перезаписывал старый файл, при это не перезаписывал файл от другого пользователя.
upd: Если сделать перезапись аву в случае одинаковых имён аватарок, то другой пользователь загрузит файл с таким же именем и перезапишет у обоих пользователей аватарку...
Controller:
public function avatar() {
if(!$this->dx_auth->is_logged_in()) {
show_404();
// $this->load->helper('url_helper');
// redirect('/', 'location');
}
$this->data['title'] = "Добавление аватарки";
if($this->input->post('userSubmit')){
//Check whether user upload picture
if(!empty($_FILES['avatar']['name'])){
$config['upload_path'] = 'uploads/images/';
$config['allowed_types'] = 'jpg|jpeg|png|gif';
// $config['file_name'] = $_FILES['avatar']['name'];
$config['max_size'] = '50';
$config['max_width'] = '150';
$config['max_height'] = '150';
$config['remove_spaces'] = TRUE;
// $config['file_name'] = 'user_avatar';
// $config['overwrite'] = TRUE;
//Load upload library and initialize configuration
$this->load->library('upload',$config);
$this->upload->initialize($config);
if($this->upload->do_upload('avatar')){
$uploadData = $this->upload->data();
$avatar = $uploadData['file_name'];
}else{
$avatar = '';
}
}else{
$avatar = '';
}
//Prepare array of user data
$userData = array(
'name' => $this->input->post('name'),
'avatar' => $avatar
);
//Pass user data to model
$insertUserData = $this->userlk_model->insertUserAvatar($userData);
//Storing insertion status message.
if($insertUserData){
$this->session->set_flashdata('success_msg', 'Аватарка добавлена!');
}else{
$this->session->set_flashdata('error_msg', 'Какие-то проблемы с загрузкой аватарки, попробуйте ещё раз или обратитесь к администрации Retris.ru');
}
}
$this->load->view('templates/header', $this->data);
$this->load->view('userlk/avatar', $this->data);
$this->load->view('templates/footer');
}
Ответы (1 шт):
Для решения Вашей задачи, Вам необходимо проводить проверку, существуют ли файл с таким же именем, как и загружаемый файл, в директории, куда Вы собираетесь загружать аватары.
$i = 1;
$originalName = $_FILES['avatar']['name'];
$fileName = $originalName;
while ( file_exists($config['upload_path'] . $fileName ) {
$extension = end(explode(".",$fileName));
$fileName = basename($originalName, ".".$extension) . "_" . $i . "." . $extension;
$i++;
}
В конце цикла, в переменной $fileName, будет содержаться уникальное имя файла, под которым его можно будет сохранить, не затрагивая другие файлы. В случае, если файла с таким же именем не существует, в переменной $fileName будет содержаться оригинальное имя. Если же файл с таким же именем уже существует, то в переменной $fileName будет содержаться имя файла в формате "ОригинальноеИмяФайла_1.расширение"
Однако, не вижу смысла сохранять файлы аватаров под оригинальным именем.
Почему бы при загрузке изображения не передавать переменную с уникальным идентификатором пользователя (ID), и не использовать шаблон для имени нового файла, например: user_ID_avatar.png?
В таком случае, PHP автоматически заменит старый аватар пользователя на новый, и это не позволит одному пользователю взаимодействовать с аватаром другого пользователя, так как уникальные ID у всех пользователей всегда будут разными.