Para formar un sistema corporativo la gestión de documentos desempeña una función importante. Si se utiliza FastReport VCL en vuestro sistema, el formato fp3 es un documento principal del informe preparado.
Para facilitar la formación de documentos de varios tipos desde el formato interior sin recompilar los informes hemos ampliado nuestros componentes cliente-servidor que permiten ahora aceptar el formato fp3 de los clientes y convertirlo en todo formato de exportación disponible.
Esto va acompañado de un sistema de caché en del que el servidor puede rechazar un archivo que ya tiene trabajar con el caché. Las pequeñas modificaciones se incluyen también, por ejemplo, el tamaño máximo del archivo recibido.
Para que vuestro servidor pueda aceptar y procesar los archivos fp3, necesita añadir un par de personalizaciones a la configuración (el archivo xml con personalizaciones).
HeaderMaxSize es un tamaño máximo del encabezado HTTP en bytes. Un valor máximo es 16384.
ContentMaxSize es un tamaño máximo de los archivos fp3 cargados en megabytes (0 – sin limitaciones).
Hemos actualizado también nuestros proyectos de exposición que ustedes pueden cargar aquí.
Para el lado del cliente estudiamos un script php en el papel de cliente, pero por supuesto el cliente puede ser escrito en cualquier lenguaje de programación.
Un formulario HTML para un script:
<html> <head> <meta charset="utf-8"> </head> <body> <form enctype="multipart/form-data" action="post.php" method="POST"> <!—El campo MAX_FILE_SIZE debe ser indicado antes del campo de la carga del archivo --> <input type="hidden" name="MAX_FILE_SIZE" value="3000000000" /> <!—El nombre del elemento input determina un nombre en la matriz $_FILES --> Send this: <input name="userfile" type="file" /> <input type="submit" value="Send File" /> </form> </body> </html>
Post.php:
<?php //La dirección del servidor FastReport $host ='http://localhost:8097'; //El formato de exportación $exportFormat = 'PDF'; //El nombre del archivo que el usuario ha seleccionado $OldName = $_FILES['userfile']['name']; //Su nombre real después de nuestra carga (sustituimos la extensión tmp por fp3) $name = substr_replace($_FILES['userfile']['tmp_name'], 'fp3', -3); //Guardamos en el servidor php move_uploaded_file($_FILES['userfile']['tmp_name'], $name); //Lo abrimos $file = new \CURLFile($name); //Inicializamos la sesión cURL $ch = curl_init(); //Instalamos un URL a cargar curl_setopt($ch, CURLOPT_URL, $host); //Seleccionamos el método de solicitud (Post) curl_setopt($ch, CURLOPT_POST, true); //Para leer los datos devueltos curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //Para leer el encabezado devuelto curl_setopt($ch, CURLOPT_HEADER, 1); //Para los archivos de gran tamaño necesita aumentar el tiempo de espera (por defecto es de 30 segundos), ajustado a 0, lo que significa la espera infinita. curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 0); //Generar MD5 para un archivo. $md5 = md5_file($name); //Enviar el formato y MD5 curl_setopt($ch, CURLOPT_HTTPHEADER , array('Format-Export: '.$exportFormat, 'Content-MD5: '.$md5)); //Comprimir el archivo antes de enviar $data = array($exportFormat => $file); //Enviar el archivo curl_setopt($ch, CURLOPT_POSTFIELDS, $data); //Esperar la respuesta $response = curl_exec($ch); //La prueba comprobada del retorno if (empty($response)) { echo 'received an empty response'; } else { if (strstr($response, 'HTTP/1.1 301') == '') { //Algo salió mal. El servidor ha devuelto una respuesta inesperada echo '404'; curl_close($ch); exit; } if (curl_errno($ch)) { //El servidor ha devuelto un error que mostramos en rojo echo '<span style="color:red">'; echo 'error: '.curl_error($ch); echo '</span>'; } else { //Extraer la dirección para obtener los resultados de exportación de la respuesta del servidor FastReport $Location = GetLocationFromHeader($response); if (empty($Location)) { echo 'error: Location not found'; } else { //Es posible dirigir al cliente a la dirección para recuperar el archivo, pero no en una arquitectura, en la que el servidor FastReport está conectado localmente al servidor php y no tiene acceso a Internet. Hay que descargar todo por vía de las herramientas del servidor php y es más seguro lógicamente para impedir el acceso a los documentos extranjeros. $file = file_get_contents_curl($host.$Location); if (empty($file)) { echo 'error: file missing'; } { //Debemos generar un nuevo nombre para devolver un archivo al cliente. //La aplicación es la siguiente: El nombre del archivo es el mismo que el del cliente, la respuesta del servidor se analiza para obtener la ampliación. //Extraemos el formato de la respuesta. Tomamos el nombre antiguo que el cliente nos ha enviado y sustituimos la extensión por el resultado de exportación (se ha enviado 123.fp3, obtenemos 123.pdf). $Format = getExtension(GetFileNameFromLocation($Location)); $OldName = substr_replace($OldName, $Format, -3); //La transmisión de los archivos del servidor php al cliente header('X-Accel-Redirect: storage/'.$OldName); header('Content-Disposition: attachment; filename="'.$OldName.'"'); echo $file; } } } } curl_close($ch); //Las funciones subsidiarias //Extraer la dirección para recuperar un resultado de conversión de la respuesta del servidor function GetLocationFromHeader($arg_1) { $Location = strstr($arg_1, 'Location'); $Location = strstr($Location, '/'); $Location = substr($Location, 0, strrpos($Location, 'SessionId')-2); return $Location; } //La recuperación del nombre del archivo desde la respuesta function GetFileNameFromLocation($arg_1) { $FN = substr($arg_1, strripos($arg_1, '/')+1, strlen($arg_1)); return $FN; } //La recuperación de la extensión desde el nombre del archivo function getExtension($fileName) { return substr($fileName, strrpos($fileName, '.') + 1); } //El análogo más rápido de la función file_get_contents function file_get_contents_curl($url) { $ch = curl_init(); curl_setopt($ch, CURLOPT_AUTOREFERER, TRUE); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE); $data = curl_exec($ch); curl_close($ch); return $data; } ?>
Así usted puede delinearse de algunos problemas grandes. No es necesario reconstruir los informes, lo que reduce la carga del servidor. Será posible reservar los informes donde desee, y la parte del cliente puede escribirse en un lenguaje de programación que es cómoda para usted.