Здравствуйте, юзаю библиотеку генерации qr code на php. По нажатию на кнопку он появляется на экране. А мне нужно, чтобы появилось диалоговое окно "сохранить как" и я мог сохранить qr code. Вот код, что в него нужно дописать, чтобы по нажатию на кнопку "Сгенерировать", чтобы появлялось диалоговое окно ? Код (Text): <?php echo "<h1>Генератор QR Code</h1><hr/>"; //set it to writable location, a place for temp generated PNG files $PNG_TEMP_DIR = dirname(__FILE__).DIRECTORY_SEPARATOR.'temp'.DIRECTORY_SEPARATOR; //html PNG location prefix $PNG_WEB_DIR = 'temp/'; include "qrlib.php"; //ofcourse we need rights to create temp dir if (!file_exists($PNG_TEMP_DIR)) mkdir($PNG_TEMP_DIR); $filename = $PNG_TEMP_DIR.'test.png'; //processing form input //remember to sanitize user input in real-life solution !!! $errorCorrectionLevel = 'L'; if (isset($_REQUEST['level']) && in_array($_REQUEST['level'], array('L','M','Q','H'))) $errorCorrectionLevel = $_REQUEST['level']; $matrixPointSize = 4; if (isset($_REQUEST['size'])) $matrixPointSize = min(max((int)$_REQUEST['size'], 1), 10); if (isset($_REQUEST['data'])) { //it's very important! if (trim($_REQUEST['data']) == '') die('data cannot be empty! <a href="?">back</a>'); // user data $filename = $PNG_TEMP_DIR.'test'.md5($_REQUEST['data'].'|'.$errorCorrectionLevel.'|'.$matrixPointSize).'.png'; QRcode::png($_REQUEST['data'], $filename, $errorCorrectionLevel, $matrixPointSize, 2); } else { //default data QRcode::png('Привет:)', $filename, $errorCorrectionLevel, $matrixPointSize, 2); } //display generated file echo '<img src="'.$PNG_WEB_DIR.basename($filename).'" /><hr/>'; //config form echo '<form action="index.php" method="post"> Введите, что хотите закодировать: <input name="data" value="'.(isset($_REQUEST['data'])?htmlspecialchars($_REQUEST['data']):'Привет :)').'" /> Коррекция ошибок: <select name="level"> <option value="L"'.(($errorCorrectionLevel=='L')?' selected':'').'>L - smallest</option> <option value="M"'.(($errorCorrectionLevel=='M')?' selected':'').'>M</option> <option value="Q"'.(($errorCorrectionLevel=='Q')?' selected':'').'>Q</option> <option value="H"'.(($errorCorrectionLevel=='H')?' selected':'').'>H - best</option> </select> Размер: <select name="size">'; for($i=1;$i<=10;$i++) echo '<option value="'.$i.'"'.(($matrixPointSize==$i)?' selected':'').'>'.$i.'</option>'; echo '</select> <input type="submit" value="Сгенерировать"></form><hr/>'; ?> Мне советовали так : Код (Text): header('Content-Disposition: attachment; filename=qrcode.png'); // Прочитав этот заголовок браузер выдаст пользователю диалог для сохранения файла на его компьютере header('Content-Transfer-Encoding: binary'); // Бинарная передача данных header('Content-Length: '.filesize($filename)); // Здесь нужно указать размер картинки qr кода в байтах echo '<img src="'.$PNG_WEB_DIR.basename($filename).'" /><hr/>'; Но так не работает. Подскажите, пожалуйста.
Первое, что бросилось в глаза - после заголовков нужно выгружать не html с тегом <img> а сами данные. То есть нужно передавать данные. Типа: echo $filedata; По хорошему вам вообще не нужно сохранять сгенерированную картинку на диск. Нужно сохранить ее в переменную, а потом эту переменную выгрузить. Если же это не возможно, то прочитать ее с диска (потом удалить с диска, дабы не плодить мусор) и отдать.
насколько я понимаю код в первом листинге, QRcode:ng() сохраняет файл на диск (на сервере). вариант 1, возможно в классе QRcode есть метод иди параметры чтобы картинка не сохранялась, а только выводилась в поток. сохранять картинку будет пользователь, если мы добавим заголовок Content-Disposition: attachment вариант 2, фиг с ним, пусть сохраняет картинку на сервере. в твоем втором листинге ошибка в echo. замени всю эту строку на Код (Text): readfile($filename); эта функция выводит файл в поток, перед этим должны быть заданы заголовки — они вроде правдоподобные у тебя. Добавлено спустя 1 минуту 25 секунд: а где-то после или перед этим тебе надо проверять папку куда сохраняются картинки и удалять все старые файлы, скажем которые старше часа от роду.