descargar archivos en 3w

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!


Sin tAtulo.png

Sin tAtulo.png

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.

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!

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.

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í…

Hola Facundo,

Si, es una alternativa, lo pasas de la DB al sistema de archivos dentro de una carpeta temporal.

saludos.

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!

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.

Si, es verdad!!
Muchas gracias,
Saludos!!