Große Dateien 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 verarbeitet werden: im Arbeitsspeicher oder als File-Streams. Wenn die Streams als File-Streams verarbeitet werden, werden die empfangenen Streams direkt auf der Festplatte gespeichert, sodass die Speicherprobleme vermieden werden.

 

Um Ihren Server so zu konfigurieren, dass er multipart/form-data-Streams als File-Streams speichert, führen Sie die folgenden Schritte aus:

 

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 File-Stream gespeichert werden. Der Standardwert ist null, was bedeutet, dass alle Streams als File-Stream gespeichert werden.

3. Der Ordner, in dem die Streams gespeichert werden, wird über SaveDirectory festgelegt; wenn er nicht gesetzt ist, werden sie im selben Ordner gespeichert, in dem sich die Anwendung befindet.

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

 

Beispielcode

 

Erstellen Sie zuerst eine neue Server-Instanz und legen Sie fest, dass die Streams als File-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 File-Stream mit der Erweiterung ".sgc_ps", und wenn der Stream vollständig empfangen wurde, extrahiert er die Datei aus den Boundaries.

 

Ereignisse

Es gibt 2 Ereignisse, die zum Anpassen 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 es, den Namen der empfangenen Datei anzupassen.


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 vom File-Input unterscheidet (Beispiel: wenn das Formular einige Variablen wie name, date... enthält).


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