Картинка перед сохранением и добавлением в бд обрабатывается функцией (конвертация, обрез и наложение водяного знака). PHP: $image_photo_server = $images->convertImage ( $_FILES ['foto'] ['tmp_name'] [$fotoNumber], 160, $_FILES ['foto'] ['type'] [$fotoNumber], false, 240 ); Далее картинка обрезается и накладывается водяной знак с помощью фукнции covertImage() и помещается в массив после возвращается обратно в переменную. PHP: return ($arrayImage['image']) ? $arrayImage : false; Как мне эту картинку переместить в нужну мне папку, пытался через move_uploaded_file но он принимает только путь временного файла из массива $_FILES. Камрады подскажите что делать. Заранее спасибо!
@bogdan_titomir, не в загруженном файле ведь изменения делаете. Следовательно надо создавать новую картинку из данных, что вернули функцией. А загруженный файл - или удалить, или сохранить для истории. Чем создавать файл изображения - выбирать Вам. Например, есть в библиотеке GD функции imagepng(), imagejpg()...
Почему? Ведь в функцию передается $_FILES['foto']['tmp_name'] PHP: <tr><td>Фото</td><td><input type="file" name="foto[]"></td></tr>
Допустим через функция imagejpg() я создал картинку как мне ее в move_uploaded_file вставить? --- Добавлено --- Функция принимает картинку из массива $_FILES обрезает ее конвертирует и наносит водяной знак далее помещает в массив и возвращает. --- Добавлено --- Вот сама функция. PHP: public function convertImage($foto, $width, $type, $putWatermark=false, $height=0) { if (!isset($this->types[$type])) { return false; } $ext = $this->types[$type]; $arrayImage = array('image' => false, 'ext' => $ext, 'width' => 0, 'height' => 0); ob_start(); // Get image sizes list($old_width, $old_height) = getimagesize($foto); if($old_width>$width or ($height and $old_height>$height)) { $k = (double)$width/$old_width; //коэфициент пропорциональности if($height and $k>(double)$height/$old_height) $k = (double)$height/$old_height; $arrayImage['width'] = $old_width*$k; $arrayImage['height'] = $old_height*$k; } else { $arrayImage['width'] = $old_width; $arrayImage['height'] = $old_height; } /* if ($old_width > $width) { $new_width = $width; // ????? ?????? $percent = ($old_width - $new_width) * 100 / $old_width; // ?????????? ???????? $plus_heigth = $percent * $old_height / 100; $new_height = $old_height - $plus_heigth; // ????? ?????? if ($new_height > $width * 1.5) { $new_height = $width * 1.5; } $arrayImage['width'] = $new_width; $arrayImage['height'] = $new_height; } else { $arrayImage['width'] = $old_width; $arrayImage['height'] = $old_height; //echo file_get_contents($foto); } */ // Load $new_foto = imagecreatetruecolor($arrayImage['width'], $arrayImage['height']); if($putWatermark) { $pathToWatermark = $_SERVER['DOCUMENT_ROOT'].'/modules/images/watermark.png'; $watermark_img_obj = imagecreatefrompng($pathToWatermark); } if (strtolower($ext) == "jpg") { $old_foto = imagecreatefromjpeg($foto); imagecopyresampled/*imagecopyresized*/($new_foto, $old_foto, 0, 0, 0, 0, $arrayImage['width'], $arrayImage['height'], $old_width, $old_height); if($putWatermark) { $new_foto = $this->create_watermark($new_foto, $watermark_img_obj, 100); } imagejpeg($new_foto, NULL, 75); } elseif (strtolower($ext) == "gif") { $old_foto = imagecreatefromgif($foto); imagecopyresampled/*imagecopyresized*/($new_foto, $old_foto, 0, 0, 0, 0, $arrayImage['width'], $arrayImage['height'], $old_width, $old_height); if($putWatermark) { $new_foto = $this->create_watermark($new_foto, $watermark_img_obj, 100); } imagegif($new_foto); } else { return false; } $arrayImage['image'] = ob_get_contents(); $arrayImage['size'] = strlen($arrayImage['image']); ob_clean(); ob_end_clean(); return ($arrayImage['image']) ? $arrayImage : false; }
Зачем вам её туда вставлять? Во-первых, imagejpeg может сразу записать файл с картинкой в нужное место (читайте документацию). Во-вторых, есть copy и rename. move_uploaded_file не просто функция перемещения файлов, она ещё проверяет, что файл был действительно загружен на сервер
В функции ковертирования и обрезки оказывается было imagejpg() и imagegif() я их засунул в переменную и дал return. Дальше что делать? Ведь copy() и rename() принимает название файла и его путь а у меня сам файл лежит. Может через file_put_contents(); попробовать он ведь файл принимает. Заранее спасибо! --- Добавлено --- Я пытался сохранить через 2 аргумент но не вышло приходил файл с названием Array 0 байт PHP: imagejpeg($new_foto, 'D:/OpenServer/domains/localhost/gigal/kartinki/'.$number_catalog.'/'.$objectId.'/' .$file_name_photo, 75); В функцию передал $objectId, и $number_catalog Здесь она принимает: PHP: public function convertImage($foto, $width, $type, $objectId, $number_catalog, $putWatermark=false, $height=0) Здесь отдает: PHP: $images->convertImage ( $_FILES ['foto'] ['tmp_name'] [$fotoNumber], $objectId, $number_catalog, 160, $_FILES ['foto'] ['type'] [$fotoNumber],false, 240 );
Исключил из передачи objectID и number_catalog просто проверить решил вообще идет передача в каталог нет не идет в чем дело не пойму.
@MouseZver, не нужен ему upload @bogdan_titomir, могу ошибаться, но попробуйте убрать перехват вывода (ob_start и иже с ним), раз уж теперь используете результат image-ext не для вывода в поток для отдачи браузеру, а в файл...
@bogdan_titomir, может все-таки с путями что напутано. Попробуйте для начала просто сохранить файл функцие imagejpeg, например в текущий каталог... то есть просто задав имя файла, без пути.
а может ТС надо документацию открыть и почитать как загружать файлы в php --- Добавлено --- там есть конкретный и простой код вот он: PHP: <?php // В PHP 4.1.0 и более ранних версиях следует использовать $HTTP_POST_FILES // вместо $_FILES. $uploaddir = '/var/www/uploads/'; $uploadfile = $uploaddir . basename($_FILES['userfile']['name']); echo '<pre>'; if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) { echo "Файл корректен и был успешно загружен.\n"; } else { echo "Возможная атака с помощью файловой загрузки!\n"; } echo 'Некоторая отладочная информация:'; print_r($_FILES); print "</pre>"; ?> взят отсюда: http://secure.php.net/manual/ru/features.file-upload.post-method.php --- Добавлено --- ---и не по теме--- интересно почему в доке в примере везде написано echo, а в конце долбанули print
@askanim, он не просто загрузить пытается, а ещё и сжать, водяной знак поставить или что-то в этом роде.
Move_upload_file применять смысла нет так как временный файл из поста летит в функцию и загоняется в массив а далее он обрезается конвертируется если нужно и наносится водяной знак потом создается картинка из исходных данных и вот тут мне надо достать картинку и переместить в нужный мне каталог.
@mkramer так у него банально загрузить не поулчается как я понял... Пусть сначала грузить сам научится, а потом уже будет лезть и читать про imagik
@bogdan_titomir да ты пойми как работать с файловой системой посмотри что в массивах лежит а потом иди дальше, а то ты пытаешься прыгнуть и сразу в 3,15 забросить без тренировок ног.
Грузить у меня получалось за это не переживайте, дело в том что мне крайне необходимо с водяным знаком картинку получать и обрезаную.
@bogdan_titomir посмотри про imagik и вообще посмотри как сохранять файлы в php. как их читать как их блин сохранять. --- Добавлено --- @bogdan_titomir тебе нужна библа для работы с изображением типа imagik и посмотри как блин сохранить файл и что вообще такое файл ты знаешь что находится в файле?
Для начала тебе нужно записать картинку в строку а потом записать строку в файл. вот я погуглил за тебя http://secure.php.net/manual/ru/function.file-put-contents.php А как записать картинку в строку я работаю с имагиком и делаю это там вот так подозреваю в твоей библе должно быть нечто схожее: $image->getImageBlob() --- Добавлено --- http://secure.php.net/manual/ru/imagick.getimageblob.php --- Добавлено --- @bogdan_titomir Если ты работаешь с GD то смотри вот там есть метод который jpg картинку сохраняет http://secure.php.net/manual/ru/function.imagejpeg.php --- Добавлено --- http://secure.php.net/manual/ru/function.imagepng.php а вот и png и там ещё множество разных методов канает для работы хоть рисуй хоть сохраняй. Не понимаешь как это работает вперёд к изучение основ ООП.
Помогло, спасибо, напутал с путями. Теперь водяной знак не наносится, но обрезается. Буду думать дальше. --- Добавлено --- Спасибо за направление, буду разбираться!