Große Dateien per POST senden

Unterstützt von

TsgcWebSocketHTTPServer

TsgcWebSocketServer_HTTPAPI

Wenn ein HTTP-Client einen multipart/form-data-Stream sendet, wird der Stream vom Server im Arbeitsspeicher gespeichert. Wenn die Dateien groß sind, kann beim Server eine Out-of-Memory-Ausnahme auftreten. Um diese Ausnahmen zu vermeiden, verfügt der Server über eine Eigenschaft namens HTTPUploadFiles, mit der Sie konfigurieren können, wie die POST-Streams behandelt werden: im Arbeitsspeicher oder als Datei-Streams. Wenn die Streams als Datei-Streams behandelt werden, werden die empfangenen Streams direkt auf der Festplatte gespeichert, sodass Speicherprobleme vermieden werden.

Um Ihren Server so zu konfigurieren, dass multipart/form-data-Streams als Datei-Streams gespeichert werden, gehen Sie wie folgt vor:

1. Setzen Sie die Eigenschaft HTTPUploadFiles.StreamType = pstFileStream. Mit dieser Konfiguration speichert der Server diese Streams auf der Festplatte.

2. Sie können konfigurieren, ab welcher Mindestgröße in Bytes die Dateien als Datei-Stream gespeichert werden. Standardmäßig ist der Wert null, was bedeutet, dass alle Streams als Datei-Stream gespeichert werden.

3. Den Ordner, in dem die Streams gespeichert werden, geben Sie über SaveDirectory an; wenn er nicht festgelegt ist, werden sie in demselben Ordner gespeichert, in dem sich die Anwendung befindet.

4. Wenn ein Client multipart/form-data sendet, wird der Inhalt innerhalb von Boundaries codiert; wenn die Eigenschaft RemoveBoundaries aktiviert ist, wird der Inhalt der Boundaries automatisch extrahiert, nachdem der vollständige Stream empfangen wurde.

Beispielcode

Erstellen Sie zunächst eine neue Server-Instanz und legen Sie fest, dass die Streams als Datei-Streams gespeichert werden.


oServer := TsgcWebSocketHTTPServer.Create(nil);
oServer.Port := 5555;
oServer.HTTPUploadFiles.StreamType := pstFileStream;
oServer.Active := True;

Erstellen Sie dann eine neue HTML-Datei mit der folgenden Konfiguration

<html>

<head><title>sgcWebSockets - Upload Big File</title></head>

<body>

<form action="http://127.0.0.1:5555/file" method="post" enctype="multipart/form-data" accept-charset="UTF-8">

<input type="file" name="file_1" />

<input type="submit" />

</form>

</body>

</html>

Öffnen Sie schließlich die HTML-Datei mit einem Webbrowser und senden Sie eine Datei an den Server. Der Server erstellt einen neuen Datei-Stream mit der Erweiterung ".sgc_ps" und extrahiert, wenn der Stream vollständig empfangen wurde, die Datei aus den Boundaries.

Ereignisse

Es gibt 2 Ereignisse, die zur Anpassung des Datei-Upload-Ablaufs verwendet werden können (erfordert, dass die Eigenschaft HTTPUploadFiles.RemoveBoundaries aktiviert ist)

OnHTTPUploadBeforeSaveFile

Dieses Ereignis wird ausgelöst, BEVOR die Datei gespeichert wird, und ermöglicht das Anpassen des Namens der empfangenen Datei.


procedure OnHTTPUploadBeforeSaveFileEvent(Sender: TObject; var aFileName: string; var aFilePath: string);
begin
  if aFileName = "test.jpg" then
    aFileName := "custom_test.jpg";
end;

OnHTTPUploadAfterSaveFile

Dieses Ereignis wird ausgelöst, NACHDEM die Datei gespeichert wurde, und ermöglicht es Ihnen, den Namen der gespeicherten Datei zu erfahren.


procedure OnHTTPUploadBeforeSaveFileEvent(Sender: TObject; const aFileName: string; const aFilePath: string);
begin
  DoLog("File Received: " + aFileName);end;

OnHTTPUploadReadInput

Dieses Ereignis wird ausgelöst, wenn der Decoder einen empfangenen Eingabewert liest, der sich von der Datei-Eingabe unterscheidet (Beispiel: wenn das Formular einige Variablen wie Name, Datum... enthält).


procedure OnHTTPUploadReadInputEvent(Sender: TObject; const aName: string; const aValue: string);
begin
  DoLog("Input value received: " + aName + ":" + aValue);end;