За последние 24 часа нас посетил 18701 программист и 1603 робота. Сейчас ищут 913 программистов ...

Сохранение картинки на php

Тема в разделе "Прочие вопросы по PHP", создана пользователем Serjuk, 27 ноя 2012.

  1. Serjuk

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

    С нами с:
    31 окт 2011
    Сообщения:
    44
    Симпатии:
    0
    Здравствуйте, юзаю библиотеку генерации qr code на php. По нажатию на кнопку он появляется на экране. А мне нужно, чтобы появилось диалоговое окно "сохранить как" и я мог сохранить qr code. Вот код, что в него нужно дописать, чтобы по нажатию на кнопку "Сгенерировать", чтобы появлялось диалоговое окно ?
    Код (Text):
    1.  
    2. <?php
    3.  
    4. echo "<h1>Генератор QR Code</h1><hr/>";
    5.  
    6. //set it to writable location, a place for temp generated PNG files
    7. $PNG_TEMP_DIR = dirname(__FILE__).DIRECTORY_SEPARATOR.'temp'.DIRECTORY_SEPARATOR;
    8.  
    9. //html PNG location prefix
    10. $PNG_WEB_DIR = 'temp/';
    11.  
    12. include "qrlib.php";
    13.  
    14. //ofcourse we need rights to create temp dir
    15. if (!file_exists($PNG_TEMP_DIR))
    16.     mkdir($PNG_TEMP_DIR);
    17.  
    18. $filename = $PNG_TEMP_DIR.'test.png';
    19.  
    20. //processing form input
    21. //remember to sanitize user input in real-life solution !!!
    22. $errorCorrectionLevel = 'L';
    23. if (isset($_REQUEST['level']) && in_array($_REQUEST['level'], array('L','M','Q','H')))
    24.     $errorCorrectionLevel = $_REQUEST['level'];
    25.  
    26. $matrixPointSize = 4;
    27. if (isset($_REQUEST['size']))
    28.     $matrixPointSize = min(max((int)$_REQUEST['size'], 1), 10);
    29.  
    30. if (isset($_REQUEST['data'])) {
    31.  
    32.     //it's very important!
    33.     if (trim($_REQUEST['data']) == '')
    34.         die('data cannot be empty! <a href="?">back</a>');
    35.  
    36.     // user data
    37.     $filename = $PNG_TEMP_DIR.'test'.md5($_REQUEST['data'].'|'.$errorCorrectionLevel.'|'.$matrixPointSize).'.png';
    38.     QRcode::png($_REQUEST['data'], $filename, $errorCorrectionLevel, $matrixPointSize, 2);
    39.  
    40. } else {
    41.  
    42.     //default data
    43.  
    44.     QRcode::png('Привет:)', $filename, $errorCorrectionLevel, $matrixPointSize, 2);
    45.  
    46. }
    47.  
    48. //display generated file
    49. echo '<img src="'.$PNG_WEB_DIR.basename($filename).'" /><hr/>';
    50.  
    51. //config form
    52. echo '<form action="index.php" method="post">
    53.     Введите, что хотите закодировать:&nbsp;<input name="data" value="'.(isset($_REQUEST['data'])?htmlspecialchars($_REQUEST['data']):'Привет :)').'" />&nbsp;
    54.     Коррекция ошибок:&nbsp;<select name="level">
    55.         <option value="L"'.(($errorCorrectionLevel=='L')?' selected':'').'>L - smallest</option>
    56.         <option value="M"'.(($errorCorrectionLevel=='M')?' selected':'').'>M</option>
    57.         <option value="Q"'.(($errorCorrectionLevel=='Q')?' selected':'').'>Q</option>
    58.         <option value="H"'.(($errorCorrectionLevel=='H')?' selected':'').'>H - best</option>
    59.     </select>&nbsp;
    60.     Размер:&nbsp;<select name="size">';
    61.  
    62. for($i=1;$i<=10;$i++)
    63.     echo '<option value="'.$i.'"'.(($matrixPointSize==$i)?' selected':'').'>'.$i.'</option>';
    64.  
    65. echo '</select>&nbsp;
    66.     <input type="submit" value="Сгенерировать"></form><hr/>';
    67.     ?>
    Мне советовали так :
    Код (Text):
    1.  
    2. header('Content-Disposition: attachment; filename=qrcode.png'); // Прочитав этот заголовок браузер выдаст пользователю диалог для сохранения файла на его компьютере
    3. header('Content-Transfer-Encoding: binary'); // Бинарная передача данных
    4. header('Content-Length: '.filesize($filename)); // Здесь нужно указать размер картинки qr кода в байтах
    5. echo '<img src="'.$PNG_WEB_DIR.basename($filename).'" /><hr/>';
    Но так не работает. Подскажите, пожалуйста.
     
  2. Dimazan

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

    С нами с:
    28 ноя 2012
    Сообщения:
    12
    Симпатии:
    0
    Первое, что бросилось в глаза - после заголовков нужно выгружать не html с тегом <img> а сами данные.
    То есть нужно передавать данные.
    Типа: echo $filedata;
    По хорошему вам вообще не нужно сохранять сгенерированную картинку на диск. Нужно сохранить ее в переменную, а потом эту переменную выгрузить. Если же это не возможно, то прочитать ее с диска (потом удалить с диска, дабы не плодить мусор) и отдать.
     
  3. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.251
    Адрес:
    там-сям
    насколько я понимаю код в первом листинге, QRcode::png() сохраняет файл на диск (на сервере).

    вариант 1, возможно в классе QRcode есть метод иди параметры чтобы картинка не сохранялась, а только выводилась в поток. сохранять картинку будет пользователь, если мы добавим заголовок Content-Disposition: attachment

    вариант 2, фиг с ним, пусть сохраняет картинку на сервере. в твоем втором листинге ошибка в echo. замени всю эту строку на
    Код (Text):
    1. readfile($filename);
    эта функция выводит файл в поток, перед этим должны быть заданы заголовки — они вроде правдоподобные у тебя.

    Добавлено спустя 1 минуту 25 секунд:
    а где-то после или перед этим тебе надо проверять папку куда сохраняются картинки и удалять все старые файлы, скажем которые старше часа от роду.