Beim Aufbau von Unternehmenssystemen spielt der Dokumentenverkehr eine wichtige Rolle. Wenn FastReport VCL in Ihrem System verwendet wird, dann ist das fp3-Format das Hauptdokument des fertigen Berichtes.
Um das Generieren von verschiedenen Dokumentenarten aus einem internen Format zu erleichtern ohne Berichte neu erstellen zu müssen, haben wir unsere Client-Server-Komponenten erweitert, die es uns nun ermöglichen, das fp3-Format von Clients zu empfangen und es in jedes verfügbare Exportformat zu konvertieren.
Hinzu kommt ein Caching-System, bei dem der Server den Empfang einer bereits vorhandenen Datei verweigern und mit dem Cache arbeiten kann. Es gibt auch kleinere Einstellungen, wie z. B. die maximale Größe der empfangenen Datei.
Damit Ihr Server fp3-Dateien empfangen und verarbeiten kann, müssen einige Einstellungen in der Konfiguration (xml-Datei mit Einstellungen) vorgenommen werden.
HeaderMaxSize ist die maximale Größe des HTTP-Headers in Bytes. Der Höchstwert beträgt 16384.
ContentMaxSize ist die maximale Größe der hochgeladenen fp3-Dateien in Megabyte (0 - unbeschränkt).
Wir haben auch unsere Demoprojekte aktualisiert, die Sie hier herunterladen können.
Im Client-Teil analysieren wir das PHP-Skript als Client, aber natürlich kann der Client in jeder Programmiersprache geschrieben werden.
HTML-Formular für das Skript:
<html> <head> <meta charset="utf-8"> </head> <body> <form enctype="multipart/form-data" action="post.php" method="POST"> <!—Das Feld MAX_FILE_SIZE soll vor dem Datei-Upload-Feld angegeben werden --> <input type="hidden" name="MAX_FILE_SIZE" value="3000000000" /> <!—Der Name des input-Elements definiert den Namen im $_FILES Array--> Send this: <input name="userfile" type="file" /> <input type="submit" value="Send File" /> </form> </body> </html>
Post.php:
<?php //Adresse des FastReport-Servers $host ='http://localhost:8097'; //Exportformat $exportFormat = 'PDF'; //Name der vom Benutzer ausgewählten Datei $OldName = $_FILES['userfile']['name']; //Ihr tatsächlicher Name nach dem Download (Ersetzen Sie die tmp-Erweiterung wird durch die fp3) $name = substr_replace($_FILES['userfile']['tmp_name'], 'fp3', -3); //Speichern Sie auf dem php-Server move_uploaded_file($_FILES['userfile']['tmp_name'], $name); //Öffnen Sie sie $file = new \CURLFile($name); //Initialisieren Sie eine cURL-Sitzung $ch = curl_init(); //Spielen wir eine downloadbare URL auf curl_setopt($ch, CURLOPT_URL, $host); //Wählen Sie die Abruftechnik (Post) curl_setopt($ch, CURLOPT_POST, true); //Zum Lesen der Rückgabedaten curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //Zum Lesen des Rückgabeheaders curl_setopt($ch, CURLOPT_HEADER, 1); //Für große Dateien müssen Sie die Wartezeit zum Senden erhöhen (Standardwert ist 30 Sekunden),
//auf 0 gesetzt, was unendliche Wartezeit bedeutet. curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 0); //MD5-Generieren für die Datei. $md5 = md5_file($name); //Format- und MD5-Übermittlung curl_setopt($ch, CURLOPT_HTTPHEADER , array('Format-Export: '.$exportFormat, 'Content-MD5: '.$md5)); //Verpacken der Datei vor dem Versand $data = array($exportFormat => $file); //Dateisendung curl_setopt($ch, CURLOPT_POSTFIELDS, $data); //Warten auf eine Antwort $response = curl_exec($ch); //Rückgabe-Testprüfung if (empty($response)) { echo 'received an empty response'; } else { if (strstr($response, 'HTTP/1.1 301') == '') { //Etwas ist schief gelaufen. Der Server hat eine unerwartete Antwort zurückgegeben echo '404'; curl_close($ch); exit; } if (curl_errno($ch)) { //Der Server hat einen Fehler zurückgegeben, den wir in rot anzeigen echo '<span style="color:red">'; echo 'error: '.curl_error($ch); echo '</span>'; } else { //Extrahieren Sie die Adresse aus der FastReport-Server-Antwort zum Abrufen der Exportergebnisse $Location = GetLocationFromHeader($response); if (empty($Location)) { echo 'error: Location not found'; } else { //Sie können den Client an die Adresse weiterleiten, um die Datei zu empfangen, aber nicht in einer Architektur,
//in der der FastReport-Server lokal mit dem php-Server verbunden ist und keinen Zugang zum Internet hat.
//Sie müssen alles über einen php-Server herunterladen und es ist logisch sicherer, um den Zugriff auf die Dokumente anderer Personen zu verhindern. $file = file_get_contents_curl($host.$Location); if (empty($file)) { echo 'error: file missing'; } { //Wir müssen einen neuen Namen generieren, um die Datei an den Client zu übergeben. //Es wird wie folgt umgesetzt: Der Dateiname ist derselbe wie der des Clients, und um die Erweiterung zu erhalten, wird die Serverantwort analysiert. //Extrahieren Sie das Format aus der Antwort. Nehmen Sie den alten Namen, den uns der Client geschickt hat,
//und ersetzen Sie die Erweiterung durch das Exportergebnis (wenn er 123.fp3 geschickt hat, erhalten Sie 123.pdf). $Format = getExtension(GetFileNameFromLocation($Location)); $OldName = substr_replace($OldName, $Format, -3); //Übertragen von Dateien vom php-Server zum Client header('X-Accel-Redirect: storage/'.$OldName); header('Content-Disposition: attachment; filename="'.$OldName.'"'); echo $file; } } } } curl_close($ch); //Zusatzfunktionen //Extrahiert die Adresse aus der Serverantwort, um das Konvertierungsergebnis zu erhalten function GetLocationFromHeader($arg_1) { $Location = strstr($arg_1, 'Location'); $Location = strstr($Location, '/'); $Location = substr($Location, 0, strrpos($Location, 'SessionId')-2); return $Location; } //Den Dateinamen aus der Antwort bekommen function GetFileNameFromLocation($arg_1) { $FN = substr($arg_1, strripos($arg_1, '/')+1, strlen($arg_1)); return $FN; } //Die Erweiterung aus dem Dateinamen bekommen function getExtension($fileName) { return substr($fileName, strrpos($fileName, '.') + 1); } //Schnelleres Analog der file_get_contents-Funktion 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; } ?>
So können Sie einige große Probleme aus dem Weg räumen. Sie brauchen die Berichte nicht neu zu erstellen, was die Belastung des Servers verringert. Berichte können gespeichert werden, wo immer Sie wollen, und der Client-Teil kann in Ihrer bevorzugten Programmiersprache geschrieben werden.