facu_garea
(Garea, Facundo)
14 Agosto, 2017 19:15
1
Hola buenas tardes… Los molesto para realizarles la siguiente consulta.
Resulta ser que estamos personalizando 3W para que docentes puedan subir y descargar unos archivos, los mismos los guardamos en la BD como lo hace Guaraní con los documentos respaldatorios, pero estoy teniendo inconvenientes para descargarlos, ya que, al hacer
echo stream_get_contents($archivo_digital['archivo']);
el sistema no me muestra el archivo sino que me muestra lo que adjunto en el print.
Es como que evita la ejecución del echo y solamente te lo visualiza en forma de error…
Hay manera de resolverlo?
Muchas gracias!
fjarque
(Jarque, María Florencia)
16 Agosto, 2017 14:32
2
Hola Facundo,
Tienen bien los headers de la página? Fijate los que se envían en el código PHP de la operación de descarga de documentos respaldatorios en Gestión: ‘<path proyecto Guaraní>/php/operaciones/ug/documentos/descargar_documento_digital.php’.
Saludos, Florencia.
facu_garea
(Garea, Facundo)
16 Agosto, 2017 15:17
3
Hola Florencia.
Si los saque de descargar_documento_digital.php…
header("Pragma: no-cache");
header("Expires: 0");
header('Content-type: application/octet-stream');
header("Content-Description: {$archivo_digital['nombre_archivo']}");
header("Content-Disposition: attachment; filename=\"{$archivo_digital['nombre_archivo']}\";");
echo stream_get_contents($archivo_digital['archivo']);
Saludos!
lleonardis
(Leonardis, Leonel Eduardo)
16 Agosto, 2017 18:02
4
Hola Facundo,
En 3W podes crear una acción en un controlador, y dentro de la misma tenes disponible la función descargar_archivo , ej:
function accion__descargar_documento()
{
.....................................
$this->descargar_archivo("<PATH_DOCUMENTO>/documento.pdf", "descarga.pdf");
}
Fíjate como se esta haciendo en:
src/siu/operaciones/cierre_cursadas/controlador.php función accion__imprimir_comprobante .
src/siu/operaciones/mensajes/controlador.php función accion__descargar .
src/siu/operaciones/impresion_actas_examen/controlador.php función accion__imprimir_acta .
saludos.
facu_garea
(Garea, Facundo)
16 Agosto, 2017 19:06
5
Hola gracias por la mano, había visto esa función, mi problema es que estos archivos no tienen un path, porque están almacenados en la BD.
Pero me parece que voy a optar por generar un temporal en el server y descargarlos desde ahí…
lleonardis
(Leonardis, Leonel Eduardo)
17 Agosto, 2017 13:15
6
Hola Facundo,
Si, es una alternativa, lo pasas de la DB al sistema de archivos dentro de una carpeta temporal.
saludos.
facu_garea
(Garea, Facundo)
18 Agosto, 2017 15:56
7
Buenas les comento que lo resolví de la siguiente manera:
function accion__descargar_archivo_funciones()
{
$temp_pro = '';
$id_tarea = $this->validate_param('arch', 'get', validador::TIPO_INT);
$archivo_digital = $this->modelo()->get_archivo_digital($id_tarea);
$temp_pro = kernel::proyecto()->get_www_temp().'/'.$archivo_digital['nombre_archivo'];
$content = stream_get_contents($archivo_digital['archivo']);
file_put_contents($temp_pro, $content);
header('Content-Description: File Transfer');
header("Content-Disposition: attachment; filename=\"{$archivo_digital['nombre_archivo']}\";");
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Content-Length: ' . filesize($temp_pro));
header("Content-Type: mime/type");
ob_clean();
flush();
readfile($temp_pro);
fclose($temp_pro);
if($temp_pro != '')
unlink($temp_pro);
}
Y lo más importante para que esto funcione, en el link agregarle class=“no-ajax”
Lo dejo por si a alguien le sirve. Saludos y muchas gracias!
lleonardis
(Leonardis, Leonel Eduardo)
18 Agosto, 2017 18:19
8
Hola Facundo,
Exacto, al link le tenes que agregar la clase CSS no-ajax , sino quiere hacer una navegación AJAX para una descarga con lo cual se rompería.
Gracias por el aporte, igual tengo algunas observaciones:
Ya tenes el método $this->descargar_archivo($path, $nombre_descarga) , con lo cual podrías hacer lo siguiente:
function accion__descargar_archivo_funciones()
{
$temp_pro = '';
$id_tarea = $this->validate_param('arch', 'get', validador::TIPO_INT);
$archivo_digital = $this->modelo()->get_archivo_digital($id_tarea);
$temp_pro = kernel::proyecto()->get_www_temp().'/'.$archivo_digital['nombre_archivo'];
$content = stream_get_contents($archivo_digital['archivo']);
$this->descargar_archivo($temp_pro, $archivo_digital['nombre_archivo']);
if($temp_pro != '')
unlink($temp_pro);
}
saludos.
facu_garea
(Garea, Facundo)
22 Agosto, 2017 13:49
9
Si, es verdad!!
Muchas gracias,
Saludos!!