} // запрещенный тип файла if ($ext == 'jpg' or $ext == 'jpeg' or $ext == 'gif' or $ext == 'png') { $up_data = array(); $up_data['full_path'] = $uploads_dir . $file; $up_data['file_path'] = $uploads_dir; $up_data['file_name'] = $file; $r = array(); $r['userfile_mini'] = 1; // делать миниатюру $r['userfile_mini_size'] = $post['f_userfile_mini_size']; $r['mini_type'] = $post['f_mini_type']; $r['prev_size'] = 100; mso_upload_mini($up_data, $r); // миниатюра mso_upload_prev($up_data, $r); // превьюшка } } echo '<div class="update">' . t('Выполнено') . '</div>'; } # загрузка нового файла if ($post = mso_check_post(array('f_session2_id', 'f_upload_submit'))) { mso_checkreferer(); require_once getinfo('common_dir') . 'uploads.php'; // функции загрузки // параметры для mso_upload // конфиг CI-библиотеки upload $mso_upload_ar1 = array('upload_path' => getinfo('uploads_dir') . $current_dir, 'allowed_types' => $allowed_types); $mso_upload_ar2 = array('userfile_title' => $post['f_userfile_title'], 'fn_mso_descritions' => $fn_mso_descritions, 'userfile_resize' => isset($post['f_userfile_resize']), 'userfile_resize_size' => $post['f_userfile_resize_size'], 'userfile_water' => isset($post['f_userfile_water']), 'userfile_water_file' => getinfo('uploads_dir') . 'watermark.png', 'water_type' => $post['f_water_type'], 'userfile_mini' => isset($post['f_userfile_mini']), 'userfile_mini_size' => $post['f_userfile_mini_size'], 'mini_type' => $post['f_mini_type'], 'prev_size' => 100, 'message1' => ''); // запомним указанные размеры и выставим их для полей формы вновь
function mso_upload($config_library = array(), $field_userfile = 'f_userfile', $r = array()) { $CI =& get_instance(); $CI->load->library('upload', $config_library); $CI->upload->initialize($config_library); // если была отправка файла, то нужно заменить поле имени с русского на что-то другое // это ошибка при копировании на сервере - он не понимает русские буквы if (isset($_FILES[$field_userfile]['name'])) { $f_temp = $_FILES[$field_userfile]['name']; // оставим только точку $f_temp = str_replace('.', '__mso_t__', $f_temp); $f_temp = mso_slug($f_temp); // остальное как обычно mso_slug $f_temp = str_replace('__mso_t__', '.', $f_temp); $ext = str_replace('.', '', strrchr($f_temp, '.')); // расширение файла if ($f_temp == '.' . $ext) { // имя файла состоит только из расширения «.jpg» $f_temp = '1' . $f_temp; } // добавляем к нему единицу $_FILES[$field_userfile]['name'] = $f_temp; } $res = $CI->upload->do_upload($field_userfile); if (!isset($r['message1'])) { $r['message1'] = '<div class="update">' . t('Загрузка выполнена') . '</div>'; } if (!isset($r['message2'])) { $r['message2'] = '<div class="error">' . t('Не удалось перименовать файл в нижний регистр') . '</div>'; } // описание файла if (!isset($r['userfile_title'])) { $r['userfile_title'] = false; } // файл, где хранится описание if (!isset($r['fn_mso_descritions'])) { $r['fn_mso_descritions'] = false; } // нужно ли менять размер if (!isset($r['userfile_resize'])) { $r['userfile_resize'] = true; } if (!isset($r['userfile_resize_size'])) { $r['userfile_resize_size'] = false; } // какой размер // водяной знак if (!isset($r['userfile_water'])) { $r['userfile_water'] = false; } // нужен ли водяной знак if (!isset($r['userfile_water_file'])) { $r['userfile_water_file'] = false; } // файл водяного знака if (!isset($r['water_type'])) { $r['water_type'] = 1; } // тип водяного знака // миниатюры всегда хранятся в подкаталоге mini if (!isset($r['userfile_mini'])) { $r['userfile_mini'] = true; } // делать миниатюру? if (!isset($r['userfile_mini_size'])) { $r['userfile_mini_size'] = false; } // размер миниатюры if (!isset($r['mini_type'])) { $r['mini_type'] = 1; } // тип миниатюры // превьюхи всегда хранятся в подкаталоге _mso_i if (!isset($r['prev_size'])) { $r['prev_size'] = 100; } // размер превьюхи if ($res) { echo $r['message1']; // если это файл картинки, то нужно сразу сделать скриншот маленький в _mso_i 100px, который будет выводиться в // списке файлов $up_data = $CI->upload->data(); // файл нужно поменять к нижнему регистру if ($up_data['file_name'] != strtolower($up_data['file_name'])) { // переименуем один раз if (rename($up_data['full_path'], $up_data['file_path'] . strtolower('__' . $up_data['file_name']))) { // потом второй в уже нужный - это из-за бага винды rename($up_data['file_path'] . strtolower('__' . $up_data['file_name']), $up_data['file_path'] . strtolower($up_data['file_name'])); $up_data['file_name'] = strtolower($up_data['file_name']); $up_data['full_path'] = $up_data['file_path'] . $up_data['file_name']; // echo '<div class="update">' . $up_data['full_path'] . $up_data['file_name'] . '</div>'; } else { echo $r['message2']; } } // если указано описание файла и файл, где это описание хранится if ($r['userfile_title'] and $r['fn_mso_descritions']) { $fn_descr = trim(strip_tags($r['userfile_title'])); // описание файла $fn_descr = str_replace('"', '', $fn_descr); // удалим лишнее $fn_descr = str_replace('\'', '', $fn_descr); if (file_exists($r['fn_mso_descritions'])) { // массив данных: fn => описание ) $mso_descritions = unserialize(read_file($r['fn_mso_descritions'])); // получим из файла все описания } else { $mso_descritions = array(); } $mso_descritions[$up_data['file_name']] = $fn_descr; write_file($r['fn_mso_descritions'], serialize($mso_descritions)); // сохраняем в файл } /* [file_name] => warfare7.jpg [file_type] => image/jpeg [file_path] => D:/xampplite/htdocs/codeigniter/uploads/ [full_path] => D:/xampplite/htdocs/codeigniter/uploads/warfare7.jpg [raw_name] => warfare7 [orig_name] => warfare.jpg [file_ext] => .jpg [file_size] => 52.09 [is_image] => 1 [image_width] => 450 [image_height] => 300 [image_type] => jpeg [image_size_str] => width="450" height="300" */ if ($up_data['is_image']) { $CI->load->library('image_lib'); $CI->image_lib->clear(); # вначале нужно изменить размер # потом делаем миниатюру с указанными размерами # потом делаем такую же миниатюру для _mso_i с размером 100x100 # меняем размер if ($r['userfile_resize'] and $r['userfile_resize_size']) { $size = abs((int) $r['userfile_resize_size']); $up_data['image_width'] >= $up_data['image_height'] ? $max = $up_data['image_width'] : ($max = $up_data['image_height']); if ($size > 1 and $size < $max) { $r_conf = array('image_library' => 'gd2', 'source_image' => $up_data['full_path'], 'new_image' => $up_data['full_path'], 'maintain_ratio' => true, 'width' => $size, 'height' => $size); $CI->image_lib->initialize($r_conf); if (!$CI->image_lib->resize()) { echo '<div class="error">' . t('Уменьшение изображения:') . ' ' . $CI->image_lib->display_errors() . '</div>'; } } } //Меняли или не меняли размер, но теперь проверяем, нужна ли нам ватермарка. if ($r['userfile_water'] and $r['userfile_water_file']) { //todo — проверка, всё ли нам прислали, всё ли на месте. В идеале бы проверить размеры картинки по отношению к ватермарке. if (!file_exists($r['userfile_water_file'])) { echo '<div class="error">' . t('Водяной знак:') . ' ' . t('файл водяного знака не найден! Загрузите его в каталог uploads/') . '</div>'; } else { $water_type = $r['water_type']; // Расположение ватермарка $hor = 'right'; //Инитим дефолтом. $vrt = 'bottom'; //Инитим дефолтом. if ($water_type == 2 or $water_type == 4) { $hor = 'left'; } if ($water_type == 2 or $water_type == 3) { $vrt = 'top'; } if ($water_type == 1) { $hor = 'center'; $vrt = 'middle'; } $r_conf = array('image_library' => 'gd2', 'source_image' => $up_data['full_path'], 'new_image' => $up_data['full_path'], 'wm_type' => 'overlay', 'wm_vrt_alignment' => $vrt, 'wm_hor_alignment' => $hor, 'wm_overlay_path' => $r['userfile_water_file']); $CI->image_lib->initialize($r_conf); if (!$CI->image_lib->watermark()) { echo '<div class="error">' . t('Водяной знак:') . ' ' . $CI->image_lib->display_errors() . '</div>'; } } } # делаем миниатюру mso_upload_mini($up_data, $r); # превьюшка mso_upload_prev($up_data, $r); } return true; } else { $er = $CI->upload->display_errors(); echo '<div class="error">' . t('Ошибка загрузки файла.') . $er . '</div>'; return false; } }