За последние 24 часа нас посетили 17575 программистов и 1716 роботов. Сейчас ищут 1832 программиста ...

Как загрузить и обработать несколько изображений?

Тема в разделе "PHP для новичков", создана пользователем Tures, 3 фев 2013.

  1. Tures

    Tures Активный пользователь

    С нами с:
    3 фев 2013
    Сообщения:
    40
    Симпатии:
    0
    Не получается обходить циклом, полученный массив и обрабатывать по-отдельности, пробовал через for - ничего не выводилось.

    Код (Text):
    1.  
    2. <?PHP
    3.  
    4. $image_path = "9lesson.png";
    5. $font_path = "OpenSans-Regular.ttf";       // в пикселях
    6. //$water_mark_text_1 = "9";
    7. if(isset($_POST["usertext"])){
    8.         $water_mark_text_2 = $_POST["usertext"];
    9. }
    10. if(empty($_POST["usertext"])){
    11.         $water_mark_text_2 = "Ваш текст";
    12. }
    13.  
    14. if(isset($_POST["usersize"])){        
    15.      $font_size = $_POST["usersize"];
    16. }
    17. if(empty($_POST["usersize"])){
    18.         $font_size = 9;
    19. }
    20.  
    21. function watermark_image($oldimage_name, $new_image_name){
    22.     global $image_path;
    23.     list($owidth,$oheight) = getimagesize($oldimage_name);
    24.     $width = $height = 300;    
    25.     $im = imagecreatetruecolor($width, $height);
    26.     $img_src = imagecreatefromjpeg($oldimage_name);
    27.     imagecopyresampled($im, $img_src, 0, 0, 0, 0, $width, $height, $owidth, $oheight);
    28.     $watermark = imagecreatefrompng($image_path);
    29.     list($w_width, $w_height) = getimagesize($image_path);        
    30.     $pos_x = $width - $w_width;
    31.     $pos_y = $height - $w_height;
    32.     imagecopy($im, $watermark, $pos_x, $pos_y, 0, 0, $w_width, $w_height);
    33.     imagejpeg($im, $new_image_name, 100);
    34.     imagedestroy($im);
    35.     unlink($oldimage_name);
    36.     return true;
    37. }
    38.  
    39.  
    40. function watermark_text($oldimage_name, $new_image_name){
    41.     global $font_path, $font_size, $water_mark_text_1, $water_mark_text_2;
    42.     list($owidth,$oheight) = getimagesize($oldimage_name);
    43.     $width = $owidth;
    44.         $height = $oheight;    
    45.     $image = imagecreatetruecolor($width, $height);
    46.     $image_src = imagecreatefromjpeg($oldimage_name);
    47.     imagecopyresampled($image, $image_src, 0, 0, 0, 0, $width, $height, $owidth, $oheight);
    48.     $black = imagecolorallocate($image, 0, 0, 0);
    49.     $blue = imagecolorallocate($image, 79, 166, 185);
    50.         $white = imagecolorallocate($image, 255, 255, 255);
    51.    // imagettftext($image, $font_size, 0, 30, 190, $black, $font_path, $water_mark_text_1);
    52.    // Цвета текста
    53.     if($_POST["usertextcolor"] == "blue"){    
    54.         $font_color = $blue;
    55.     }
    56.        
    57.         if($_POST["usertextcolor"] == "white"){
    58.         $font_color = $white;
    59.     }
    60.        
    61.         if($_POST["usertextcolor"] == "black"){
    62.         $font_color = $black;
    63.     }
    64.        
    65.        
    66.    //
    67.     imagettftext($image, $oheight*2/100, 90, $owidth-9, $oheight-7, $font_color, $font_path, $water_mark_text_2);
    68.     imagejpeg($image, $new_image_name, 100);
    69.     imagedestroy($image);
    70.     unlink($oldimage_name);
    71.     return true;
    72. }
    73. $demo_image= "";
    74.  
    75. if(isset($_POST['createmark']) and $_POST['createmark'] == "Submit"){
    76.     $path = "uploads/";
    77.     $valid_formats = array("jpg", "bmp", "jpeg", "png");
    78.         $name = $_FILES['imgfile']['name'];
    79.         if(strlen($name))
    80. {
    81.    list($txt, $ext) = explode(".", $name);
    82.    if(in_array($ext,$valid_formats)&& $_FILES['imgfile']['size'] <= 17*1024*1024)
    83.         {
    84.     $upload_status = move_uploaded_file($_FILES['imgfile']['tmp_name'], $path.$_FILES['imgfile']['name']);
    85.     if($upload_status){
    86.         $new_name = $path.time().".jpg";
    87.         if(watermark_text($path.$_FILES['imgfile']['name'], $new_name))
    88.                 $demo_image = $new_name;
    89.                
    90.     }
    91.         }
    92.         else
    93.         $msg="Максимальный размер файла 2МБ, поддерживаемые форматы .jpg and .bmp";
    94.         }
    95. }
    96. ?>
    97. <html>
    98.     <head>
    99.         <title>
    100.             Watemark
    101.         </title>
    102.        
    103.         <style type="text/css">
    104.             body{ width:800px; margin: 15px auto; padding:0px; font-family: arial}    
    105.            
    106.         </style>
    107.        
    108.     </head>
    109.     <body>
    110.        
    111.         <form name="imageUpload" id="imageUpload" method="post" enctype="multipart/form-data" >
    112.             <fieldset>
    113.                 <legend>Ваши данные</legend>
    114.                 Ваше изображение :<input type="file" name="imgfile[]" id="imgfile"/>                Ваш текст: <input style="margin-left: 69;" type="text" name="usertext" value="© "><br>
    115.                  Цвет текста:       <select style="margin-left: 54;" name="usertextcolor" size="1">
    116.                                     <option value="white">Белый</option>                                    
    117.                                     <option value="black">Черный</option>                                    
    118.                                     </select></br>                  
    119.                 <input type="submit" name="createmark" id="createmark" value="Submit" />                
    120.             </fieldset>
    121.             <? echo $noimg; ?>  
    122.             <?PHP
    123.                 if(!empty($demo_image))
    124.                     echo '<br/><center><div style="max-width:800px;"><img style="max-width:790px;" src="'.$demo_image.'" /></div></center>';
    125.                                 else
    126.                                     echo '<h3>'.$msg.'</h3>';
    127.             ?>
    128.         </form>
    129.    
    130.    
    131.     </body>
    132. </html>
     
  2. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    1. в форме должно быть несколько полей с именем imgfile[] (поле атрибут id у всех тогда будет разный!)
    2. на стороне php мы увидим $_FILES[имя_поля][индекс_в_массиве] = массив_информации_о_файле.
    итерируем foreach( $_FILES['imgfile'] as $fileinfo ) - получаем поочередно доступ к каждому файлу. а дальше логика как у одиночного файла - проверка, ресайз, вотермарк и тдтп.

    Добавлено спустя 5 минут 6 секунд:
    Код (Text):
    1. list($txt, $ext) = explode(".", $name);
    2. if(in_array($ext,$valid_formats)&& $_FILES['imgfile']['size'] <= 17*1024*1024)
    это очень плохая проверка. по расширению файлы идентифицирует только Microsoft Windows. все остальные (нормальные) системы ориентируются на содержимое файла - так называемый MIMETYPE. иными словами я вам дам zip-архив с расширением jpeg и ваша система попытается обработать этот файл как изображение. а умная система увидит внутри zip-заголовок. рекомендую сразу переписать на работу с содержимым файла, а не с расширением.
    кстати, еще один облом. у меня камера делает изображения с расширением .JPG а это НЕ равно строке .jpg то есть я не смогу загрузить файл не изменив регистр разрешения.
     
  3. Tures

    Tures Активный пользователь

    С нами с:
    3 фев 2013
    Сообщения:
    40
    Симпатии:
    0
    Апач выдает: explode() expects parameter 2 to be string, array given

    Код (Text):
    1.  
    2. foreach( $_FILES['imgfile'] as $fileinfo ) {
    3. if(isset($_POST['createmark']) and $_POST['createmark'] == "Submit"){
    4.     $path = "uploads/";
    5.     $valid_formats = array("jpg", "bmp", "jpeg", "png");
    6.     $name = $_FILES['imgfile']['name'];
    7.     if(count($name))
    8. {
    9.    list($txt, $ext) = explode(".", $name);
    10.    if(in_array($ext,$valid_formats)&& $_FILES['imgfile']['size'] <= 17*1024*1024)
    11.     {
    12.     $upload_status = move_uploaded_file($_FILES['imgfile']['tmp_name'], $path.$_FILES['imgfile']['name']);
    13.     if($upload_status){
    14.         $new_name = $path.time().".jpg";
    15.         if(watermark_text($path.$_FILES['imgfile']['name'], $new_name))
    16.                 $demo_image = $new_name;
    17.                
    18.     }
    19.     }
    20.     else
    21.     $msg="Максимальный размер файла 2МБ, поддерживаемые форматы .jpg and .bmp";
    22.     }
    23. } }
     
  4. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    потому что вы не понимаете что именно делаете.
    Код (Text):
    1. foreach( $_FILES['imgfile'] as $fileinfo ) {
    2. if(isset($_POST['createmark']) and $_POST['createmark'] == "Submit"){
    3.     $path = "uploads/";
    4.     $valid_formats = array("jpg", "bmp", "jpeg", "png");
    5.    $name = $_FILES['imgfile']['name'];
    6.   if(count($name))
    7.   {
    логика условно:
    1. итерируем каждый элемент в массиве _FILES['imgfile'] как массив $fileinfo - это правильно скопировано.
    2. если есть ключ createmark в массиве _POST и его значение равно строке 'Submit' - вот эта проверка будет у вас каждую итерацию. а не должна.
    3. объявляем путь - каждый раз, хотя нужно только один
    4. объявляем валидные форматы - ну тут вы на свое усмотрение. выше рекомендация так не делать.
    5. присвоить переменной $name значение _FILES['imgfile']['name'] - вот тут у вас уже нет данных. мы ведь несколько файлов массивом imgfile передаем а не один файл в поле imgfile. следовательно имя файла искать надо в _FILES['imgfile'][индекс_в_массиве]['name'].
    но мы же в первом действии начали итерировать каждый элемент _FILES['imgfile'][индекс_в_массиве] как $fileinfo. следовательно имя файла текущей итерации можно спокойно найти в $fileinfo['name'].
    6. если в массиве содержащемся в переменной $name есть элементы - постойте, мы же сюда запихиваем строку с именем файла а не массив имен файлов. может быть empty() или strlen() ?

    и тд...
     
  5. Tures

    Tures Активный пользователь

    С нами с:
    3 фев 2013
    Сообщения:
    40
    Симпатии:
    0
    Теперь постоянно сообщение - "Максимальный размер файла 2МБ, поддерживаемые форматы .jpg and .bmp". Хотя в условии только расширение и размер.

    Код (Text):
    1.  
    2. if(isset($_POST['createmark']) and $_POST['createmark'] == "Submit"){
    3.     $path = "uploads/";
    4.     foreach( $_FILES['imgfile'] as $fileinfo ) {
    5.     $valid_formats = array("jpg", "bmp", "jpeg", "JPG");
    6.     $name = $fileinfo['name'];
    7.     if(empty($name))
    8. {
    9.    if($_FILES['imgfile']['type'] == "image/jpg"&& $_FILES['imgfile']['size'] <= 17*1024*1024)
    10.     {
    11.     $upload_status = move_uploaded_file($_FILES['imgfile']['tmp_name'], $path.$_FILES['imgfile']['name']);
    12.     if($upload_status){
    13.         $new_name = $path.time().".jpg";
    14.         if(watermark_text($path.$_FILES['imgfile']['name'], $new_name))
    15.                 $demo_image = $new_name;
    16.                
    17.     }
    18.     }
    19.     else
    20.     $msg="Максимальный размер файла 2МБ, поддерживаемые форматы .jpg and .bmp";
    21.     }
    22. } }
    Код (Text):
    1. <?php
    2.                 if(!empty($demo_image)) {
    3.                   echo '<br/><center><div style="max-width:800px;"><img style="max-width:790px;" src="'.$demo_image.'" /></div></center>'; }
    4.                 else {
    5.                     echo '<h3>'.$msg.'</h3>';
    6.                 }
    7.             ?>
     
  6. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    прошу прощения, немного не так. уж больно давно с формами не работал. сейчас перепишу.

    Добавлено спустя 49 минут 18 секунд:
    вот такой скрипт (с избыточными для дебага данными):
    Код (PHP):
    1. <?php
    2. // путь к каталогу загрузок
    3. $upload_path = './upload/';
    4.  
    5. // кол-во полей для загрузки файлов
    6. $upload_files_cnt = 4;
    7.  
    8. // лимит размера файла
    9. $file_size_limit = 17825792; //17*1024*1024;
    10. // кстати, чтоб у сервера все получилось - размер входящих данных
    11. // должен быть не менее $upload_files_cnt * $file_size_limit
    12.  
    13. // валидные типы изображений
    14. $valid_formats = array('image/jpeg', 'image/bmp', 'image/png');
    15. ?>
    16. <html>
    17.     <head>
    18.         <title>ru.php.43426-1</title>
    19.     </head>
    20.     <body>
    21.         <pre><?php var_dump( $_POST, $_FILES );?></pre>
    22. <?php
    23. if( isset( $_POST['createmark'] ) && 'Submit' == $_POST['createmark'] && isset( $_FILES['imgfile'] ) )
    24. {
    25.     for( $i = 0; $i < $upload_files_cnt; $i++ )
    26.     {
    27.         echo "\n======\n";
    28.         
    29.         // имя оригинального файла, ...
    30.         $name = isset( $_FILES['imgfile']['name'][ $i ] ) ? trim( $_FILES['imgfile']['name'][ $i ] ) : '';
    31.         // ... тип, ...
    32.         $mime = isset( $_FILES['imgfile']['type'][ $i ] ) ? trim( $_FILES['imgfile']['type'][ $i ] ) : '';
    33.         // ... размер, ...
    34.         $size = isset( $_FILES['imgfile']['size'][ $i ] ) ? doubleval( $_FILES['imgfile']['size'][ $i ] ) : 0;
    35.         // ... и путь к временной копии загруженного файла
    36.         $temp = isset( $_FILES['imgfile']['tmp_name'][ $i ] ) ? trim( $_FILES['imgfile']['tmp_name'][ $i ] ) : '';
    37.         
    38.         // путь, куда переместим файл
    39.         $temp2 = $upload_path . $name;
    40.         // путь к обработанному файлу
    41.         $new_name = $upload_path . time() . '.jpg';
    42.         
    43.         var_dump( $name, $mime, $size, $temp, $temp2, $new_name );
    44.         
    45.         if( strlen( $name ) && in_array( $mime, $valid_formats ) && $size <= $file_size_limit )
    46.         {
    47.             // сюда попадаем, если файл в текущей итерации прошел проверку имени, типа и размера
    48.             
    49.             if( @ move_uploaded_file( $temp, $temp2 ) )
    50.             {
    51.                 // сюда попадаем, если файл успешно перемещен из временного хранилища в $upload_path
    52.                 // собака перед именем функции - для подавления возможных ошибок
    53.                 
    54.                 // тут вызов watermark_text( $temp2, $new_name )
    55.                 echo "\nWATERMARK\n";
    56.             }
    57.         }
    58.         else
    59.         {
    60.             ?>Максимальный размер файла 17МБ, поддерживаемые форматы JPEG, BMP, PNG.<?php
    61.         }
    62.     } // for( i = 0 ...
    63. }
    64. else // if( isset && submit ) .. else ..
    65. {
    66. ?>
    67. <form name="imageUpload" id="imageUpload" method="post" enctype="multipart/form-data" >
    68. <?php for( $i = 1; $i <= $upload_files_cnt; $i++ ){ ?>img-<?=$i?> :<input type="file" name="imgfile[]" id="imgfile-<?=$i?>"/><br><?php } // for( i = 1 .. ?>
    69. <input type="submit" name="createmark" value="Submit" />
    70. <?php
    71. } // if( isset && submit ) .. else ..
    72. ?>
    73. </form></body></html>

    запуск №1 - увидим форму и пустые массивы _POST и _FILES.
    полученный браузером код:
    Код (Text):
    1. <html>
    2.     <head>
    3.         <title>ru.php.43426-1</title>
    4.     </head>
    5.     <body>
    6.         <pre>array(0) {
    7. }
    8. array(0) {
    9. }
    10. </pre>
    11. <form name="imageUpload" id="imageUpload" method="post" enctype="multipart/form-data" >
    12. img-1 :<input type="file" name="imgfile[]" id="imgfile-1"/><br>img-2 :<input type="file" name="imgfile[]" id="imgfile-2"/><br>img-3 :<input type="file" name="imgfile[]" id="imgfile-3"/><br>img-4 :<input type="file" name="imgfile[]" id="imgfile-4"/><br><input type="submit" name="createmark" value="Submit" />
    13. </form></body></html>

    запуск №2 - отправка формы. даю ей переживать один жипег (валид по типу), один гиф (инвалид по типу) и два поля оставляю пустыми. ожидаю увидеть хорошую информацию о первом файле и три сообщения об ошибке:
    Код (Text):
    1.  
    2. <html>
    3.     <head>
    4.         <title>ru.php.43426-1</title>
    5.     </head>
    6.     <body>
    7.         <pre>array(1) {
    8.   ["createmark"]=>
    9.   string(6) "Submit"
    10. }
    11. array(1) {
    12.   ["imgfile"]=>
    13.   array(5) {
    14.     ["name"]=>
    15.     array(4) {
    16.       [0]=>
    17.       string(9) "3109.JPEG"
    18.       [1]=>
    19.       string(10) "Ascii1.gif"
    20.       [2]=>
    21.       string(0) ""
    22.       [3]=>
    23.       string(0) ""
    24.     }
    25.     ["type"]=>
    26.     array(4) {
    27.       [0]=>
    28.       string(10) "image/jpeg"
    29.       [1]=>
    30.       string(9) "image/gif"
    31.       [2]=>
    32.       string(0) ""
    33.       [3]=>
    34.       string(0) ""
    35.     }
    36.     ["tmp_name"]=>
    37.     array(4) {
    38.       [0]=>
    39.       string(14) "/tmp/phpmJ5Gc8"
    40.       [1]=>
    41.       string(14) "/tmp/phpnDbsoD"
    42.       [2]=>
    43.       string(0) ""
    44.       [3]=>
    45.       string(0) ""
    46.     }
    47.     ["error"]=>
    48.     array(4) {
    49.       [0]=>
    50.       int(0)
    51.       [1]=>
    52.       int(0)
    53.       [2]=>
    54.       int(4)
    55.       [3]=>
    56.       int(4)
    57.     }
    58.     ["size"]=>
    59.     array(4) {
    60.       [0]=>
    61.       int(134646)
    62.       [1]=>
    63.       int(25167)
    64.       [2]=>
    65.       int(0)
    66.       [3]=>
    67.       int(0)
    68.     }
    69.   }
    70. }
    71. </pre>
    72.  
    73. ======
    74. string(9) "3109.JPEG"
    75. string(10) "image/jpeg"
    76. float(134646)
    77. string(14) "/tmp/phpmJ5Gc8"
    78. string(18) "./upload/3109.JPEG"
    79. string(23) "./upload/1359899321.jpg"
    80.  
    81. WATERMARK
    82.  
    83. ======
    84. string(10) "Ascii1.gif"
    85. string(9) "image/gif"
    86. float(25167)
    87. string(14) "/tmp/phpnDbsoD"
    88. string(19) "./upload/Ascii1.gif"
    89. string(23) "./upload/1359899321.jpg"
    90. Максимальный размер файла 17МБ, поддерживаемые форматы JPEG, BMP, PNG.
    91. ======
    92. string(0) ""
    93. string(0) ""
    94. float(0)
    95. string(0) ""
    96. string(9) "./upload/"
    97. string(23) "./upload/1359899321.jpg"
    98. Максимальный размер файла 17МБ, поддерживаемые форматы JPEG, BMP, PNG.
    99. ======
    100. string(0) ""
    101. string(0) ""
    102. float(0)
    103. string(0) ""
    104. string(9) "./upload/"
    105. string(23) "./upload/1359899321.jpg"
    106. Максимальный размер файла 17МБ, поддерживаемые форматы JPEG, BMP, PNG.</form></body></html>
    как видно, WATERMARK будет запущен только один раз, остальные файлы нас огорчили.


    логика должна быть примерно такой. извините, что направил в неверном направлении.
     
  7. Tures

    Tures Активный пользователь

    С нами с:
    3 фев 2013
    Сообщения:
    40
    Симпатии:
    0
    Извеняюсь за любопытство, но как вотемарк вставить и вывести...
    Ввод и вывод из массива понял, но немного затруднения с вотемарком.
     
  8. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    оффтоп
    любопытство это хорошо. я понимаю, что вы пишите в форуме для новичков, но, давайте я не буду основы алгоритмизации программирования вам объяснять. просто для себя сейчас распишите на бумаге последовательность действий по шагам. от первоначального показа формы до отправки пользователя к странице "ура у меня тут все получилось". просто как вы себе это видите. этот алгоритм опишите человеческими словами. сможете - будем отвечать на возникшие при реализации этого алгоритма вопросы. не сможете - не вижу смысла засорять голову тем что называется программированием.
    /оффтоп


    для этого берется файл, на который будем знаки накладывать (1) и нужные для вотермарка данные (2) будь то это готовый графический файл или изображение, генерируемое налету (например произвольный текст). далее берем холст 1 и накладываем на него холст 2 в определенном месте с определенной геометрией и прозрачностью (3).
    получившийся файл складируем на память предкам или сразу выкидываем в браузер пользователя (4).

    как видите, план состоит из 4 пунктов, но алгоритма и кода будет больше. в первом посте (я не вчитывался) какая-то функция у вас вроде реализована.
     
  9. Tures

    Tures Активный пользователь

    С нами с:
    3 фев 2013
    Сообщения:
    40
    Симпатии:
    0
    Извеняюсь, но я понял структуру цикла, переписал более нормально код, меня интересует как сделать чтобы цикл обрабатывал столько изображений, сколько было загружено или если есть имя у загруженного файла. У меня есть код но с циклом он не работает.
    Код (Text):
    1.  
    2. <?php
    3.             // если нажата кнопка загрузки
    4. if(isset($_POST['createmark']))
    5. {
    6.     // директория для хранения загружаемых изображений
    7.     $path = "uploads/";
    8.     // цикл перебора данных
    9.     for(!empty($name); !empty($demo_image);){
    10. // массив разрешенных расширений
    11.     $valid_formats = array("jpg","bmp","jpeg");
    12.     // получаем имя загружаемого изображения
    13.     $name = $_FILES['imgfile']['name'];
    14.     // имя есть, то:
    15.     if(strlen($name))
    16.     {
    17.         // получаем тип загружаемого файла
    18.         $ext = explode("/", $_FILES['imgfile']['type']);
    19.         // если расширение принадлежит массиву разрешенных расширений и размер <= 2Мб, то загружаем изображение
    20.         if(in_array($ext[1],$valid_formats)&& $_FILES['imgfile']['size'] <= 15*1024*1024)
    21.         {
    22.             // загружаем изображение
    23.             $upload_status = move_uploaded_file($_FILES['imgfile']['tmp_name'], $path.$_FILES['imgfile']['name']);
    24.             // при успешной загрузке        
    25.             if($upload_status)
    26.             {
    27.                 // задаем директорию и имя для сохранения нового изображения
    28.                 $new_name = $path.time().".jpg";
    29.                 // добавляем водяной знак: watermark_text() - для текста, watermark_image() - для изображения
    30.                 if(watermark_text($path.$_FILES['imgfile']['name'], $new_name))
    31.                     $demo_image = $new_name;
    32.                     if(!empty($demo_image))
    33.                     echo '<br/><center><img src="'.$demo_image.'" border="1"/></center>';                  
    34.                 else
    35.                     echo '<h3>Не получилось!</h3>';
    36.                              
    37.             }
    38.             else
    39.                 echo "Загрузка не удалась!";
    40.         }
    41.         else
    42.             echo "Превышен размер разружаемого файла (Max 15Мб). Либо изображение имеет не верный формат";
    43.     }
    44.     }  
    45. }
    46.             ?>
     
  10. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    а что у вас с таким кодом происходит-то? насколько я вижу - итерации есть, вызов вашей фабрики ватермарков есть, следовательно оно должно работать правильно. давайте подумаем, что не правильно?
     
  11. Tures

    Tures Активный пользователь

    С нами с:
    3 фев 2013
    Сообщения:
    40
    Симпатии:
    0
    Код ничего не выводит на страницу.

    Полный код
    Код (Text):
    1.  
    2. <?php
    3. // Если запускать под Linux, то указаваем что используемый нами шрифт лежит в этой же директории
    4. putenv('GDFONTPATH=' . realpath('.'));
    5.  
    6. // задаем переменные
    7. $font_path = "OpenSans-Regular.ttf";    // шрифт
    8. $font_size = 9;                 // размер шрифта в px
    9. $water_mark_text = "site.name"; // текст
    10.  
    11. // подключаем используемые функции
    12. include 'watermark.func.php';
    13. $demo_image= "";
    14. ?>
    15. <html>
    16.     <head>
    17.         <title></title>
    18.     </head>
    19.     <body>
    20.    
    21.         <form name="imageUpload" id="imageUpload" method="post" enctype="multipart/form-data" >
    22.             <fieldset>
    23.                 <legend>Загрузка изображения</legend>
    24.                 Изображение :<input type="file" name="imgfile" id="imgfile"/><br />
    25.                 Цвет текста:       <select style="margin-left: 54;" name="usertextcolor" size="1">
    26.                                     <option value="white">Белый</option>                                    
    27.                                     <option value="black">Черный</option>                                    
    28.                                     </select></br>
    29.                 <input type="submit" name="createmark" id="createmark" value="Загрузка" />
    30.             </fieldset>  
    31.             <?php
    32.             // если нажата кнопка загрузки
    33. if(isset($_POST['createmark']))
    34. {
    35.     // директория для хранения загружаемых изображений
    36.     $path = "uploads/";
    37.     // массив разрешенных расширений
    38.     $valid_formats = array("jpg","bmp","jpeg");
    39.     // получаем имя загружаемого изображения
    40.     $name = $_FILES['imgfile']['name'];
    41.     // имя есть, то:
    42.     if(strlen($name))
    43.     {
    44.         // получаем тип загружаемого файла
    45.         $ext = explode("/", $_FILES['imgfile']['type']);
    46.         // если расширение принадлежит массиву разрешенных расширений и размер <= 2Мб, то загружаем изображение
    47.         if(in_array($ext[1],$valid_formats)&& $_FILES['imgfile']['size'] <= 15*1024*1024)
    48.         {
    49.             // загружаем изображение
    50.             $upload_status = move_uploaded_file($_FILES['imgfile']['tmp_name'], $path.$_FILES['imgfile']['name']);
    51.             // при успешной загрузке        
    52.             if($upload_status)
    53.             {
    54.                 // задаем директорию и имя для сохранения нового изображения
    55.                 $new_name = $path.time().".jpg";
    56.                 // добавляем водяной знак: watermark_text() - для текста, watermark_image() - для изображения
    57.                 if(watermark_text($path.$_FILES['imgfile']['name'], $new_name))
    58.                     $demo_image = $new_name;
    59.                     if(!empty($demo_image))
    60.                     echo '<br/><center><img src="'.$demo_image.'" border="1"/></center>';                  
    61.                 else
    62.                     echo '<h3>Не получилось!</h3>';
    63.                              
    64.             }
    65.             else
    66.                 echo "Загрузка не удалась!";
    67.         }
    68.         else
    69.             echo "Превышен размер разружаемого файла (Max 15Мб). Либо изображение имеет не верный формат";
    70.     }  
    71. }
    72.             ?>
    73.         </form>    
    74.    
    75.     </body>
    76. </html>
    watermark.func.php
    Код (Text):
    1.  
    2. <?php
    3.  
    4. /**
    5.  * Наложение водяного знака в виде текста
    6.  * @param $oldimage_name - исходное изображение
    7.  * @param $new_image_name - выходное изображение
    8.  * @return Boolean
    9.  */
    10. function watermark_text($oldimage_name, $new_image_name){
    11.     // получение значений шрифта, размера и текста, используемых для наложение
    12.     global $font_path, $font_size, $water_mark_text;
    13.     // получаем размеры исходного изображения
    14.     list($owidth,$oheight) = getimagesize($oldimage_name);
    15.     // задаем размеры для выходного изображения    
    16.     $width = $owidth;
    17.     $height = $oheight;
    18.     // создаем выходное изображение размерами, указанными выше
    19.     $image = imagecreatetruecolor($width, $height);
    20.     $image_src = imagecreatefromjpeg($oldimage_name);
    21.     // разрешения
    22.    
    23.     // наложение на выходное изображение, исходного
    24.     imagecopyresampled($image, $image_src, 0, 0, 0, 0, $width, $height, $owidth, $oheight);
    25.     // задаем цвет для накладываемого текста
    26.     $black = imagecolorallocate($image, 0, 0, 0);
    27.     $white = imagecolorallocate($image, 255, 255, 255);
    28.     if($_POST["usertextcolor"] == "white"){
    29.     $font_color = $white;
    30.     }  
    31.     if($_POST["usertextcolor"] == "black"){
    32.     $font_color = $black;
    33.     }
    34.     // определяем позицию расположения водяного знака        
    35.     $pos_x = $width - (strlen($water_mark_text)-1)*$font_size;
    36.     $pos_y = $height;
    37.     // наложение текста на выходное изображение    
    38.     imagettftext($image, $oheight*2/100, 90, $owidth-9, $oheight-7, $white, $font_path, $water_mark_text);
    39.     // сохраняем выходное изображение, уже с водяным знаком в формате jpg и качеством 100
    40.     imagejpeg($image, $new_image_name, 100);
    41.     // уничтожаем изображения
    42.     imagedestroy($image);
    43.     unlink($oldimage_name);
    44.     return true;
    45. }
    46.  
    47. ?>
     
  12. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    почему?

    оффтоп
    вы пишите программу. вы обязаны знать какие данные где находятся на каждом шаге выполнения программы. если что-то пошло не так - сравниваете данные в своей голове с данными в программе. вот эта процедура называется дебаг. если у вас вообще ничего не выводится - возможно, вы отключили вывод ошибок. и это допустим нормальная практика. но на этапе написания программы вы вправе выводить все необходимые для отладки данные удобным для вас образом.
    судя по тому что программа ничего не выводит, то, возможно, она ничего и не должна выводить, но дебаг должным образом вы явно не проводите. в первую очередь вам самому нужно знать что происходит с вашей программой, и только если у вас останутся к самому себе вопросы - задавать вопросы на форуме.
    знаете как багтрек организован в общей массе? "делаю то-то, жду вот так, вижу вот это", + дополнительные сведения о софте/железе и тп. и девелоперы пытаются воспроизвести ошибку у себя. если находят - начинают исправлять. не находят - ставят метку "не воспроизводима".
    когда я вижу подобные пустые запросы "помогите!!! не работает ничего!!!" мне хочется ответить "а комп-то включен?"
    /оффтоп
     
  13. Tures

    Tures Активный пользователь

    С нами с:
    3 фев 2013
    Сообщения:
    40
    Симпатии:
    0
    Проблема с циклом, без цикла все работает отлично.

    Добавлено спустя 9 минут 4 секунды:
    Выдает Warning: strlen() expects parameter 1 to be string, array given in Z:\home\watemark\www\index.php on line 45
    и до бесконечности выводит это сообщение.
     
  14. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    вот видите, сразу стало понятно что вы работаете с алгоритм "для одного файла" - итераций у вас нет - а отправляете ему несколько файлов.
     
  15. Tures

    Tures Активный пользователь

    С нами с:
    3 фев 2013
    Сообщения:
    40
    Симпатии:
    0
    explode() expects parameter 2 to be string, array given
     
  16. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    тут вы методу, который разбивает строку по шаблону на элементы массива - даете массив.
    вы вообще контролируете что у вас в программе-то происходит? я вам сказал что вы используете одну итерацию давая ей множественный ввод. то есть надо просто понять какая разница между приемом одного файла и нескольких файлов, глядя на мой код, например. и внести нужную коррективу в свой код.
    ругань на эксплод имеет те же корни что и корни на стрлен и пых сообщает что не может обработать массив, так как ожидает строку. и корни эти упираются в то что вы не итерируете входящие несколько файлов а работаете как с одним.
     
  17. Tures

    Tures Активный пользователь

    С нами с:
    3 фев 2013
    Сообщения:
    40
    Симпатии:
    0
    получается надо вместо $_FILES['imgfile']['name'],
    использовать в цикле $_FILES['imgfile']['name'][$i].
    т.е.
    Код (Text):
    1.  
    2. //пролистываем весь массив изображений по одному $_FILES['imgfile']['name'] as $i => $name
    3. foreach ($_FILES['imgfile']['name'] as $i=>$name)
    4. {
    5. ...
    6. }
    7. ...
    Только выводит все равно ошибку - explode() expects parameter 2 to be string
     
  18. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    отлично, итерацию имени делаем. а остальное-то? прекратите пальцем в небо тыкать. в моем примере нет foreach() потому как он будет итерировать только один массив из всех, переданных скрипту. чтоб вы сами не запутались - я привел вам пример цикла for() который будет контролировать индекс итерации а вы из всех массивов, полагающихся передаче файлов будете выдергивать соответствующие итерации данные.
    если вы хотите продолжить вашим путем - до foreach() объявляете переменную индекса итерации которую инкременируете в конце итерации.

    а ошибку он выводит потому что вы обращаетесь к массиву а должны - к строковому значению. изучите внимательно дебаг, который я ради вас сюда постил и надеюсь у вас больше не возникнет вопросов с процедурой загрузки нескольких файлов.
     
  19. Tures

    Tures Активный пользователь

    С нами с:
    3 фев 2013
    Сообщения:
    40
    Симпатии:
    0
    Вроде цикл есть, а сервер запрос обрабатывает долго - Maximum execution time of 30 seconds exceeded
    Код (Text):
    1.  
    2. <?php
    3.             // если нажата кнопка загрузки
    4. if(isset($_POST['createmark']))
    5. {
    6.     // директория для хранения загружаемых изображений
    7.     $path = "uploads/";
    8.     //ставим цикл с условием, прибавляем на единицу $i
    9. for($i=1; !empty($_FILES['imgfile']['name']); $i++)
    10. {
    11.     $valid_formats = array("jpg","bmp","jpeg");
    12.     // получаем имя загружаемого изображения
    13.     $name = $_FILES['imgfile']['name'][$i];
    14.     // имя есть, то:
    15.     if(strlen($name))
    16.     {
    17.         // получаем тип загружаемого файла
    18.         $ext = explode("/", $_FILES['imgfile']['type'][$i]);
    19.         // если расширение принадлежит массиву разрешенных расширений и размер <= 2Мб, то загружаем изображение
    20.         if(in_array($ext[1],$valid_formats)&& $_FILES['imgfile']['size'][$i] <= 15*1024*1024)
    21.         {
    22.             // загружаем изображение
    23.             $upload_status = move_uploaded_file($_FILES['imgfile']['tmp_name'][$i], $path.$_FILES['imgfile']['name'][$i]);
    24.             // при успешной загрузке        
    25.             if($upload_status)
    26.             {
    27.                 // задаем директорию и имя для сохранения нового изображения
    28.                 $new_name = $path.time().".jpg";
    29.                 // добавляем водяной знак: watermark_text() - для текста, watermark_image() - для изображения
    30.                 if(watermark_text($path.$_FILES['imgfile']['name'][$i], $new_name))
    31.                     $demo_image = $new_name;
    32.                     if(!empty($demo_image))
    33.                     echo '<br/><center><img style="max-width:700px;" src="'.$demo_image.'" border="1"/></center>';                 
    34.                 else
    35.                     echo '<h3>Не получилось!</h3>';
    36.                              
    37.             }
    38.             else
    39.                 echo "Загрузка не удалась!";
    40.         }
    41.         else
    42.             echo "Превышен размер разружаемого файла (Max 15Мб). Либо изображение имеет не верный формат";
    43.     }  
    44. }
    45. }
    46. ?>
     
  20. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    вы вообще понимаете чо пишите? вот тут вы ляпнули бесконечный цикл. слабо взять строку из моего скрипта? я когда писал, я старался написать рабочий скрипт, чтоб вы его сразу интегрировали. а вы уже два дня изображаете что-то с чем-то, обходя мой труд и пытаясь сделать как можно больше ошибок.
     
  21. Tures

    Tures Активный пользователь

    С нами с:
    3 фев 2013
    Сообщения:
    40
    Симпатии:
    0
    Так то работает с вашим кодом, но иногда выводит два одинаковых изображения.
     
  22. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    это "иногда" на вашей совести, догадываетесь?))) отлаживайте лучше, допиливайте код пока в нем не останется странных моментов
     
  23. Tures

    Tures Активный пользователь

    С нами с:
    3 фев 2013
    Сообщения:
    40
    Симпатии:
    0
    Понял, большое спасибо!
    Надо было просто добавить - $new_name = $upload_path .time().$i. '.jpg';
     
  24. Tures

    Tures Активный пользователь

    С нами с:
    3 фев 2013
    Сообщения:
    40
    Симпатии:
    0
    У меня вопрос, как очищать папку раз в сутки, функция очистки у меня есть, интересует условие if.

    //Оффтоп
    Понял, решил через планировщик задач Cron.
     
  25. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    а иф-то в задаче каким местом? я опять недополучил данных из вашей головы)))