Сохранить уменьшенное изображение в другую папку [CodeIgniter]

Я пытаюсь создать миниатюру для изображения, которое будет загружено на мой сервер. Ссылаться на 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();
}
}

1

Решение

Надеюсь, что это поможет вам :

использование 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

1

Другие решения

Вы нашли правильное решение, используя переименование или копирование.

Причина, по которой он не работает с 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. Всегда полезно проверить результат такой операции, чтобы реагировать, если что-то идет не так.

1