Я пытаюсь создать миниатюру для изображения, которое будет загружено на мой сервер. Ссылаться на https://www.codeigniter.com/userguide3/libraries/image_lib.html#processing-an-image . После создания я хочу сохранить эскиз в другую папку, так как исходное изображение и эскиз будут сохранены в одном месте.
Итак, я пытаюсь использовать move_uploaded_file()
функция, но она не может переместить файл. Я не совсем уверен, правильно ли сделан мой код. Проверьте это.
Belwo мой код:
if($_FILES['file_name']['size'] != 0){
$config['upload_path'] = FCPATH.MEDIA_LIB_URI.'facts';
$config['allowed_types'] = 'jpg|jpeg|png|gif';
$config['max_size'] = 0;
$newFileName = removeExt($_FILES['file_name']['name']).'-'.uniqueId(); // renaming the file name without the ext
$new_name = $newFileName.getExt($_FILES['file_name']['name']); // new file name with the ext
$config['file_name'] = $new_name;
$this->load->library('upload',$config);
$this->upload->initialize($config);
if($this->upload->do_upload('file_name')){
$uploadData = $this->upload->data();
$file_name = $uploadData['file_name'];
$this->load->library('image_lib');
$configer = array(
'image_library' => 'gd2',
'source_image' => $uploadData['full_path'],
'create_thumb' => TRUE,
'maintain_ratio' => TRUE,
'width' => 950,
'height' => 950,
);
$this->image_lib->clear();
$this->image_lib->initialize($configer);
$this->image_lib->resize();
$thumbName = $newFileName.'_thumb'.getExt($_FILES['file_name']['name']); // getting the exact thumbnail name that been created by codeigniter
move_uploaded_file($thumbName, FCPATH.MEDIA_LIB_URI.'facts/thumbnail/'.$new_name);
return $file_name;
} else {
return $this->upload->display_errors();
}
}
Надеюсь, что это поможет вам :
использование new_image
в вашем $configer
чтобы изменить путь к папке: $config['new_image'] = '/path/to/new_image.jpg';
Заметка :
Если указано только новое имя изображения, оно будет помещено в ту же папку, что и исходное изображение.
Если указан только путь, новое изображение будет помещено в место назначения с тем же именем, что и оригинал.
Если указан путь и имя изображения, оно будет помещено в его собственное место назначения и получит новое имя.
Ваш код должен быть таким:
if($this->upload->do_upload('file_name'))
{
$uploadData = $this->upload->data();
$file_name = $uploadData['file_name'];
$this->load->library('image_lib');
$configer = array(
'image_library' => 'gd2',
'source_image' => $uploadData['full_path'],
'create_thumb' => TRUE,
'maintain_ratio' => TRUE,
'width' => 950,
'height' => 950,
'new_image' => FCPATH.MEDIA_LIB_URI.'facts/thumbnail/'
);
$this->image_lib->clear();
$this->image_lib->initialize($configer);
$this->image_lib->resize();
return $file_name;
}
else
{
return $this->upload->display_errors();
}
Для большего : https://www.codeigniter.com/user_guide/libraries/image_lib.html#CI_Image_lib::resize
Вы нашли правильное решение, используя переименование или копирование.
Причина, по которой он не работает с move_uploaded_file, заключается в том, что эта функция будет перемещать только загруженный файл, временное имя которого равно «tmp_name» в массиве $ _FILES.
Причина такого поведения объясняется в руководстве по PHP: «Эта функция проверяет, является ли файл, обозначенный именем файла, допустимым файлом загрузки (это означает, что он был загружен с помощью механизма загрузки HTTP POST HTTP). Если файл действителен, он будет перемещен в имя файла, заданное адресатом.
Такая проверка особенно важна, если есть вероятность, что что-либо, сделанное с загруженными файлами, может раскрыть их содержимое пользователю или даже другим пользователям в той же системе ».
В соответствии с руководством по PHP для загрузки метода POST:
$ _FILES [‘userfile’] [‘name’] = Исходное имя файла на клиентском компьютере.
$ _FILES [‘userfile’] [‘tmp_name’] = Временное имя файла, в котором загруженный файл был сохранен на сервере.
Конец цитаты
«tmp_name» — это уникальный ключ, сгенерированный сервером, поэтому в файловой системе нет дублирования имени файла.
В вашем коде строка $ thumbnail, которую вы создали, не соответствует «tmp_name» из массива $ _FILES.
Причина, по которой вы не получили сообщение об ошибке, заключается в том, что снова из руководства по PHP, но для файла move_uploaded_file на этот раз: «Если имя файла не является допустимым файлом загрузки, никаких действий не произойдет, и move_uploaded_file () вернет FALSE».
Поэтому, если вы фиксируете результат move_uploaded_file в своем коде, например, $ moveResult = move_uploaded_file (… в результате вы получите $ moveResult === false. Всегда полезно проверить результат такой операции, чтобы реагировать, если что-то идет не так.