За последние 24 часа нас посетили 194939 программистов и 1997 роботов. Сейчас ищут 1723 программиста ...

Как вытащить из массива картинку и перенести в папку.

Тема в разделе "PHP для новичков", создана пользователем bogdan_titomir, 22 ноя 2017.

  1. bogdan_titomir

    bogdan_titomir Новичок

    С нами с:
    7 окт 2017
    Сообщения:
    159
    Симпатии:
    2
    Картинка перед сохранением и добавлением в бд обрабатывается функцией (конвертация, обрез и наложение водяного знака).
    PHP:
    1. $image_photo_server = $images->convertImage ( $_FILES ['foto'] ['tmp_name'] [$fotoNumber], 160, $_FILES ['foto'] ['type'] [$fotoNumber], false, 240 );

    Далее картинка обрезается и накладывается водяной знак с помощью фукнции covertImage() и помещается в массив после возвращается обратно в переменную.
    PHP:
    1. return ($arrayImage['image']) ? $arrayImage : false;

    Как мне эту картинку переместить в нужну мне папку, пытался через move_uploaded_file но он принимает только путь временного файла из массива $_FILES.

    Камрады подскажите что делать. Заранее спасибо!
     
  2. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.593
    Симпатии:
    362
    @bogdan_titomir, не в загруженном файле ведь изменения делаете. Следовательно надо создавать новую картинку из данных, что вернули функцией. А загруженный файл - или удалить, или сохранить для истории.
    Чем создавать файл изображения - выбирать Вам. Например, есть в библиотеке GD функции imagepng(), imagejpg()...
     
    Maputo нравится это.
  3. bogdan_titomir

    bogdan_titomir Новичок

    С нами с:
    7 окт 2017
    Сообщения:
    159
    Симпатии:
    2
    Почему? Ведь в функцию передается $_FILES['foto']['tmp_name']
    PHP:
    1. <tr><td>Фото</td><td><input type="file" name="foto[]"></td></tr>
     
  4. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.593
    Симпатии:
    362
    А функция что делает? И как она описана (параметры, возвращаемое значение)?
     
  5. bogdan_titomir

    bogdan_titomir Новичок

    С нами с:
    7 окт 2017
    Сообщения:
    159
    Симпатии:
    2
    Допустим через функция imagejpg() я создал картинку как мне ее в move_uploaded_file вставить?
    --- Добавлено ---
    Функция принимает картинку из массива $_FILES обрезает ее конвертирует и наносит водяной знак далее помещает в массив и возвращает.
    --- Добавлено ---
    Вот сама функция.
    PHP:
    1. public function convertImage($foto, $width, $type, $putWatermark=false, $height=0)
    2.   {
    3.     if (!isset($this->types[$type]))
    4.     {
    5.       return false;
    6.     }
    7.     $ext = $this->types[$type];
    8.     $arrayImage = array('image' => false, 'ext' => $ext, 'width' => 0, 'height' => 0);
    9.     ob_start();
    10.     // Get image sizes
    11.     list($old_width, $old_height) = getimagesize($foto);      
    12.    
    13.     if($old_width>$width or ($height and $old_height>$height))
    14.     {
    15.         $k = (double)$width/$old_width; //коэфициент пропорциональности
    16.         if($height and $k>(double)$height/$old_height)
    17.         $k = (double)$height/$old_height;
    18.        
    19.         $arrayImage['width'] = $old_width*$k;
    20.         $arrayImage['height'] = $old_height*$k;          
    21.     }
    22.     else
    23.     {
    24.         $arrayImage['width'] = $old_width;
    25.         $arrayImage['height'] = $old_height;
    26.     }
    27.     /*
    28.     if ($old_width > $width)
    29.     {
    30.       $new_width = $width; // ????? ??????
    31.       $percent = ($old_width - $new_width) * 100 / $old_width; // ?????????? ????????
    32.       $plus_heigth = $percent * $old_height / 100;
    33.       $new_height = $old_height - $plus_heigth; // ????? ??????
    34.       if ($new_height > $width * 1.5)
    35.       {
    36.         $new_height = $width * 1.5;
    37.       }
    38.       $arrayImage['width'] = $new_width;
    39.       $arrayImage['height'] = $new_height;
    40.     }
    41.     else
    42.     {
    43.       $arrayImage['width'] = $old_width;
    44.       $arrayImage['height'] = $old_height;
    45.       //echo file_get_contents($foto);
    46.     }
    47.     */
    48.     // Load
    49.     $new_foto = imagecreatetruecolor($arrayImage['width'], $arrayImage['height']);
    50.    
    51.     if($putWatermark)
    52.     {
    53.       $pathToWatermark = $_SERVER['DOCUMENT_ROOT'].'/modules/images/watermark.png';
    54.       $watermark_img_obj = imagecreatefrompng($pathToWatermark);
    55.     }
    56.    
    57.     if (strtolower($ext) == "jpg")
    58.     {
    59.       $old_foto = imagecreatefromjpeg($foto);
    60.       imagecopyresampled/*imagecopyresized*/($new_foto, $old_foto, 0, 0, 0, 0, $arrayImage['width'], $arrayImage['height'], $old_width, $old_height);
    61.       if($putWatermark) {
    62.         $new_foto = $this->create_watermark($new_foto, $watermark_img_obj, 100);
    63.       }
    64.       imagejpeg($new_foto, NULL, 75);
    65.     }
    66.     elseif (strtolower($ext) == "gif")
    67.     {
    68.       $old_foto = imagecreatefromgif($foto);
    69.       imagecopyresampled/*imagecopyresized*/($new_foto, $old_foto, 0, 0, 0, 0, $arrayImage['width'], $arrayImage['height'], $old_width, $old_height);
    70.       if($putWatermark) {
    71.         $new_foto = $this->create_watermark($new_foto, $watermark_img_obj, 100);
    72.       }
    73.       imagegif($new_foto);
    74.     }
    75.     else
    76.     {
    77.       return false;
    78.     }
    79.     $arrayImage['image'] = ob_get_contents();
    80.     $arrayImage['size'] = strlen($arrayImage['image']);
    81.     ob_clean();
    82.     ob_end_clean();
    83.  
    84.     return ($arrayImage['image']) ? $arrayImage : false;
    85.   }
     
  6. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Зачем вам её туда вставлять? Во-первых, imagejpeg может сразу записать файл с картинкой в нужное место (читайте документацию). Во-вторых, есть copy и rename. move_uploaded_file не просто функция перемещения файлов, она ещё проверяет, что файл был действительно загружен на сервер
     
  7. bogdan_titomir

    bogdan_titomir Новичок

    С нами с:
    7 окт 2017
    Сообщения:
    159
    Симпатии:
    2
    Спасибо за совет.
     
  8. bogdan_titomir

    bogdan_titomir Новичок

    С нами с:
    7 окт 2017
    Сообщения:
    159
    Симпатии:
    2
    В функции ковертирования и обрезки оказывается было imagejpg() и imagegif() я их засунул в переменную и дал return. Дальше что делать? Ведь copy() и rename() принимает название файла и его путь а у меня сам файл лежит. Может через file_put_contents(); попробовать он ведь файл принимает. Заранее спасибо!
    --- Добавлено ---
    Я пытался сохранить через 2 аргумент но не вышло приходил файл с названием Array 0 байт
    PHP:
    1. imagejpeg($new_foto, 'D:/OpenServer/domains/localhost/gigal/kartinki/'.$number_catalog.'/'.$objectId.'/'
    2. .$file_name_photo, 75);
    В функцию передал $objectId, и $number_catalog

    Здесь она принимает:
    PHP:
    1.   public function convertImage($foto, $width, $type, $objectId, $number_catalog, $putWatermark=false, $height=0)
    Здесь отдает:
    PHP:
    1. $images->convertImage ( $_FILES ['foto'] ['tmp_name'] [$fotoNumber], $objectId, $number_catalog, 160, $_FILES ['foto'] ['type'] [$fotoNumber],false, 240 );
     
  9. bogdan_titomir

    bogdan_titomir Новичок

    С нами с:
    7 окт 2017
    Сообщения:
    159
    Симпатии:
    2
    Исключил из передачи objectID и number_catalog просто проверить решил вообще идет передача в каталог нет не идет в чем дело не пойму.
     
  10. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.823
    Симпатии:
    1.333
    Адрес:
    Лень
  11. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.593
    Симпатии:
    362
    @MouseZver, не нужен ему upload :)
    @bogdan_titomir, могу ошибаться, но попробуйте убрать перехват вывода (ob_start и иже с ним), раз уж теперь используете результат image-ext не для вывода в поток для отдачи браузеру, а в файл...
     
  12. bogdan_titomir

    bogdan_titomir Новичок

    С нами с:
    7 окт 2017
    Сообщения:
    159
    Симпатии:
    2
    Убирал, не помогло:(
    --- Добавлено ---
    Покурю на досуге, спасибо!:)
     
  13. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.593
    Симпатии:
    362
    @bogdan_titomir, может все-таки с путями что напутано. Попробуйте для начала просто сохранить файл функцие imagejpeg, например в текущий каталог... то есть просто задав имя файла, без пути.
     
    bogdan_titomir нравится это.
  14. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Просто нельзя ковырять чужой код, не зная php...
     
  15. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    а может ТС надо документацию открыть и почитать как загружать файлы в php
    --- Добавлено ---
    там есть конкретный и простой код вот он:
    PHP:
    1. <?php
    2. // В PHP 4.1.0 и более ранних версиях следует использовать $HTTP_POST_FILES
    3. // вместо $_FILES.
    4.  
    5. $uploaddir = '/var/www/uploads/';
    6. $uploadfile = $uploaddir . basename($_FILES['userfile']['name']);
    7.  
    8. echo '<pre>';
    9. if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
    10.     echo "Файл корректен и был успешно загружен.\n";
    11. } else {
    12.     echo "Возможная атака с помощью файловой загрузки!\n";
    13. }
    14.  
    15. echo 'Некоторая отладочная информация:';
    16. print_r($_FILES);
    17.  
    18. print "</pre>";
    19.  
    20. ?>
    взят отсюда:
    http://secure.php.net/manual/ru/features.file-upload.post-method.php
    --- Добавлено ---
    ---и не по теме---
    интересно почему в доке в примере везде написано echo, а в конце долбанули print :D
     
  16. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    @askanim, он не просто загрузить пытается, а ещё и сжать, водяной знак поставить или что-то в этом роде.
     
  17. bogdan_titomir

    bogdan_titomir Новичок

    С нами с:
    7 окт 2017
    Сообщения:
    159
    Симпатии:
    2
    Move_upload_file применять смысла нет так как временный файл из поста летит в функцию и загоняется в массив а далее он обрезается конвертируется если нужно и наносится водяной знак потом создается картинка из исходных данных и вот тут мне надо достать картинку и переместить в нужный мне каталог.
     
  18. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    @mkramer так у него банально загрузить не поулчается как я понял... Пусть сначала грузить сам научится, а потом уже будет лезть и читать про imagik
     
  19. bogdan_titomir

    bogdan_titomir Новичок

    С нами с:
    7 окт 2017
    Сообщения:
    159
    Симпатии:
    2
    Спасибо, попробую.
     
  20. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    @bogdan_titomir да ты пойми как работать с файловой системой посмотри что в массивах лежит а потом иди дальше, а то ты пытаешься прыгнуть и сразу в 3,15 забросить без тренировок ног.
     
  21. bogdan_titomir

    bogdan_titomir Новичок

    С нами с:
    7 окт 2017
    Сообщения:
    159
    Симпатии:
    2
    Грузить у меня получалось за это не переживайте, дело в том что мне крайне необходимо с водяным знаком картинку получать и обрезаную.
     
  22. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    @bogdan_titomir посмотри про imagik и вообще посмотри как сохранять файлы в php. как их читать как их блин сохранять.
    --- Добавлено ---
    @bogdan_titomir тебе нужна библа для работы с изображением типа imagik и посмотри как блин сохранить файл и что вообще такое файл ты знаешь что находится в файле?
     
  23. bogdan_titomir

    bogdan_titomir Новичок

    С нами с:
    7 окт 2017
    Сообщения:
    159
    Симпатии:
    2
    ок, буду в этом направлении копать.
     
  24. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    Для начала тебе нужно записать картинку в строку а потом записать строку в файл.
    вот я погуглил за тебя
    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
    и там ещё множество разных методов канает для работы хоть рисуй хоть сохраняй. Не понимаешь как это работает вперёд к изучение основ ООП.
     
    bogdan_titomir нравится это.
  25. bogdan_titomir

    bogdan_titomir Новичок

    С нами с:
    7 окт 2017
    Сообщения:
    159
    Симпатии:
    2
    Помогло, спасибо, напутал с путями. Теперь водяной знак не наносится, но обрезается. Буду думать дальше.
    --- Добавлено ---
    Спасибо за направление, буду разбираться!:)