Pregunta

Soy nuevo en el desarrollo de Joomla y PHP, así que tengan paciencia.

Extrayendo algunos datos simples después de una prueba para dibujar una imagen de certificado.Necesito que los usuarios hagan clic en un enlace y descarguen esa imagen.

Una vez más, puedo hacer que algo funcione fuera de Joomla pero no dentro.Ni siquiera he llegado a la imagen creada dinámicamente todavía y tengo problemas solo con una imagen estática, es decir, el archivo descargado no es válido.

Aquí hay un script que pude hacer funcionar fuera de Joomla, usando la vista previa de la plantilla como una imagen existente:

<?php
header("Content-type: image/png");  
header('Content-Disposition: attachment; filename="template_preview.png"');  
readfile('template_preview.png');  

Cuando se descarga la imagen es correcta.

Sin embargo, en mi archivo Joomla:

<?php defined('_JEXEC') or die;
require_once("includes/variables_certificate.php"); 
header("Content-type: image/png");  
header("Content-Type: application/octet-stream");  
header('Content-Disposition: attachment; filename="template_preview.png"');  
$filename = JPATH_SITE.'/templates/'.$this->template.'/template_preview.png';  
readfile($filename);  

Me sale una imagen no válida.Esta ni siquiera es la parte en la que estoy incorporando la imagen dinámica todavía :/

¿Algunas ideas?

El único otro hilo que pude encontrar en Joomla fue aquí y no es el mismo problema: Forzar la descarga de archivos en PHP - dentro del marco de JoomlaTambién seguí un montón de ejemplos aquí: http://php.net/manual/en/function.header.php

¡Gracias a todos de antemano!

#############################################

Solución parcial que funciona para imágenes estáticas (¡gracias @Chris!), aunque intento que la imagen dinámica funcione

descargar.php:

<?php
require_once("includes/variables_certificate.php");
defined('_JEXEC') or die;
// $filename = JPATH_SITE.'/templates/'.$this->template.'/template_preview.png'; //works
$filename = JURI::root().'index.php?tmpl=certgenerator&quizmod='.$quizmod; //Not working

header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="certificate.png"');
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($filename));
ob_clean();
flush();
readfile($filename);
exit;

y el certgenerator.php:

defined('_JEXEC') or die;
require_once("includes/variables_certificate.php");

$image_file = JPATH_SITE.'templates/'.$this->template.'/images/certificate_page.png'; 
$my_img = imagecreatefrompng ($image_file);
$font_size_big = 24;
$text_color = imagecolorallocate( $my_img, 0, 255, 0 );
$font_file = JPATH_SITE.'templates/'.$this->template.'/FelipaRegular.ttf';  

imagefttext( $my_img, $font_size_big, 0, 55, 75, $text_color, $font_file, "why u no work"); //if commented out image displays but not font obviously, as it's written now it returns a blank page
imagestring( $my_img, 4, 30, 25, "works", $text_color ); //works but doesn't include font

header( "Content-type: image/png" );
imagepng( $my_img );

imagecolordeallocate( $text_color );
imagedestroy( $my_img );
¿Fue útil?

Solución

Utilice el búfer de salida y descargue el archivo en el navegador.También podría querer estar seguro de que defined('_JEXEC') devuelve verdadero.

<?php
require_once("includes/variables_certificate.php");
defined('_JEXEC') or die;
$filename = JPATH_SITE.'/templates/'.$this->template.'/template_preview.png';

header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.basename($filename));
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($filename));
ob_clean();
flush();
readfile($filename);
exit;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top