Erweiterung der Client-Server-Komponenten zum Empfang und Senden von fp3-Dateien

2021-12-13

FastReport VCL

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.

Neue Einstellungen in der Konfiguration

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.

20. November 2024

Lokalisierung und Ändern von Sprachen in FastReport VCL

FastReport VCL unterstützt 40 Sprachen für die Schnittstellenlokalisierung und ermöglicht es Ihnen, die Sprache im laufenden Betrieb über Menüs oder Code ohne Neukompilierung zu ändern.
26. Juli 2024

Aktualisierung von HTMLObject als Plugin für FastReport .NET

Ausführliche Anleitung zur Verwendung des neuen HTMLObject-Plugins, das die Aufteilung des HTML-Doms in FastReport-Berichtsobjekte verwendet.
11. Dezember 2023

Neuer S3 (Amazon) Transport in FastReport VCL

In diesem Artikel werden wir uns den neuen Transport in S3 (Amazon) für FastReport VCL ansehen, bei dem es sich um einen Objektspeicher für Dateien und Buckets handelt.
Fast Reports
  • 800-985-8986 (Englisch, die USA)
  • +4930568373928 (Deutsch)
  • +55 19 98147-8148 (Portugiesisch)
  • info@fast-report.com
  • 66 Canal Center Plaza, Ste 505, Alexandria, VA 22314

© 1998-2024 Fast Reports Inc.