У меня есть этот код, который выводит QR-код:
<?php
include(JPATH_LIBRARIES . '/phpqrcode/qrlib.php');
$db = JFactory::getDbo();
$user = JFactory::getUser();
$query = $db->getQuery(true);
$query->select($db->quoteName(array('Soci', 'Nom', 'Cognoms', 'eCorreu')))
->from($db->quoteName('#__rsform_socis'))
->where($db->quoteName('username') . ' = '. $db->quote($user->username));
$db->setQuery($query);
$codeContents = $db->loadObjectList();
$data .= "Soci Nº: {$codeContents[0]->Soci}\n ";
$data .= "Nom: {$codeContents[0]->Nom} ";
$data .= "{$codeContents[0]->Cognoms}\n";
$data .= "e-correu: {$codeContents[0]->eCorreu}";
$tempDir = JPATH_SITE . '/images/';
$fileName = 'qr_'.md5($data).'.png';
$pngAbsoluteFilePath = $tempDir.$fileName;
$urlRelativeFilePath = JUri::root() .'images/' . $fileName;
if (!file_exists($pngAbsoluteFilePath)) {
QRcode::png($data, $pngAbsoluteFilePath);
}
echo '<img src="'.$urlRelativeFilePath.'" />';
?>
Как добавить кнопку загрузки, чтобы пользователь мог загрузить код на компьютер?
Спасибо,
Дани
Это больше вопрос HTML, так что давайте начнем: есть атрибут «скачать», и вы можете использовать его следующим образом:
echo '<a href="'.$urlRelativeFilePath.'" download="qrcode.png">Download QR</a>';
Он загружает файл как имя, которое вы указали здесь. Поэтому, если URL-адрес изображения на вашем сервере: wadAHEybwdYRfaedBFD22324Dsefmsf.png, файл будет загружен как «qrcode.png». К сожалению, это поддерживается не во всех браузерах. Еще одно простое решение — создать форму с именем вашего файла в виде действия:
echo '<form method="get" action="'.$urlRelativeFilePath.'"><button type="submit">Download QR Code!</button></form>';
Другой способ (немного больше кода) сделать это — использовать PHP с некоторыми конкретными заголовками, такими как это:
<?php
// place this code inside a php file and call it f.e. "download.php"$path = $_SERVER['DOCUMENT_ROOT']."/path2file/"; // change the path to fit your websites document structure
$fullPath = $path.$_GET['download_file'];
if ($fd = fopen ($fullPath, "r")) {
$fsize = filesize($fullPath);
$path_parts = pathinfo($fullPath);
$ext = strtolower($path_parts["extension"]);
switch ($ext) {
case "pdf":
header("Content-type: application/pdf"); // add here more headers for diff. extensions
header("Content-Disposition: attachment; filename=\"".$path_parts["basename"]."\""); // use 'attachment' to force a download
break;
default;
header("Content-type: application/octet-stream");
header("Content-Disposition: filename=\"".$path_parts["basename"]."\"");
}
header("Content-length: $fsize");
header("Cache-control: private"); //use this to open files directly
while(!feof($fd)) {
$buffer = fread($fd, 2048);
echo $buffer;
}
}
fclose ($fd);
exit;
// example: place this kind of link into the document where the file download is offered:
// <a href="download.php?download_file=some_file.pdf">Download here</a>
?>
Он работает для больших и маленьких файлов, а также для многих различных типов файлов. Информация найдена здесь: http://www.finalwebsites.com/forums/topic/php-file-download
Ну, вы, очевидно, создаете .png
файл изображения QR-кода с вашим скриптом. Так что просто добавьте ссылку на расположение картинки:
echo "<a href=\"images/$fileName\">Download</a>";
Это, однако, просто перенаправит пользователя на изображение в его браузере.
Если вы хотите принудительно загрузить файл, вам потребуется использовать заголовки PHP для отправки файла в браузер посетителей.
Например, сделайте скрипт и назовите его download_code.php
,
Затем добавьте:
echo "<a href=\"download_code.php?filename=$fileName\">Download</a>";
И в download_code.php
:
$handle = fopen("/var/www/yourdomain.com/images/" . $filename, "r");
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.$filename);
header('Content-Transfer-Encoding: binary');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Expires: 0');
header('Pragma: public');
header('Content-Length: ' . filesize("/var/www/yourdomain.com/images" . $filename));
flush();
readfile("/var/www/yourdomain.com/images" . $filename);
fclose($handle);