Saludos,
estoy necesitando servir archivos a los usuarios, archivos que tengo listados en una tabla y que solo ellos podrian verlos. ¿Existe algún método en toba para esto? y si no, ¿De que manera podría hacerlo?.
Estoy usando Toba 1.1.0.
Desde ya muchas gracias.
Te dejo un explicación vaga, si ves que algo puntual no se entiende o asume algo incorrecto lo vemos en profundidad.
Suponiendo que tenés una operación que lista los archivos según el usuario actual (usando por ejemplo toba::usuario()->get_id()) una formal de descargar dicho archivo es hacer otra operación en cuyas propiedades tenga “Solicitud PHP Plano” (este nombre puede variar en la 1.1, no la tengo a mano) y especificar un archivo php por ejemplo ‘descarga.php’
En la operación que lista los archivos, hay que hacer un vinculo a esta nuevo operación y por ejemplo enviarle por GET el id del archivo a bajar.
El vinculo quedaría así
$parametros = array('id_archivo' => <id_archivo);
toba::vinculador()->get_url(null, <id_operacion_descarga>, $parametros);
El receptor de este vinculo debería escuchar este parametro y, validacion mediante de que puede efectivamente verlo, enviarlo al cliente:
$id_archivo = toba::memoria()->get_parametro('id_archivo');
//TODO: Validar que $id_archivo existe y que el usuario actual tenga permisos de bajarlo
//Suponiendo que sea un pdf enviar los headers correspondientes
header('Content-type: application/pdf');
header('Content-Disposition: attachment; filename="archivo.pdf"');
echo file_get_contents($path_archivo);
Si el archivo fisicamente esta en la base de datos se puede consultar con un select común, php retorna un file pointer al archivo y con fread podés ir enviandolo al cliente.
Exelente, muchas gracias.
Si a alguien le interesa, el header que utilicé (Sacados de la doc de php) sirve para forzar la descarga:
if (file_exists($file)) {
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.basename($file));
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($file));
ob_clean();
flush();
readfile($file);
exit;
}