Grote bestanden posten

Ondersteund door

TsgcWebSocketHTTPServer

TsgcWebSocketServer_HTTPAPI

Wanneer een HTTP-client een multipart/form-data-stroom verstuurt, wordt deze stroom door de server in het geheugen opgeslagen. Bij grote bestanden kan de server een out of memory-uitzondering krijgen. Om deze uitzonderingen te voorkomen, heeft de server een eigenschap genaamd HTTPUploadFiles waarmee u kunt instellen hoe de POST-stromen worden verwerkt: in het geheugen of als bestandsstromen. Als de stromen als bestandsstromen worden verwerkt, worden de ontvangen stromen direct op de harde schijf opgeslagen, zodat geheugenproblemen worden vermeden.

Volg de onderstaande stappen om uw server zo te configureren dat multipart/form-data-stromen als bestandsstromen worden opgeslagen:

1. Stel de eigenschap HTTPUploadFiles.StreamType = pstFileStream in. Met deze instelling slaat de server deze stromen op op de harde schijf.

2. U kunt instellen wat de minimale grootte in bytes is waarbij bestanden als bestandsstroom worden opgeslagen. Standaard is de waarde nul, wat betekent dat alle stromen als bestandsstroom worden opgeslagen.

3. De map waarin de stromen worden opgeslagen via SaveDirectory; als deze niet is ingesteld, worden ze opgeslagen in dezelfde map als de applicatie.

4. Wanneer een client een multipart/form-data verstuurt, wordt de inhoud gecodeerd binnen boundaries. Als de eigenschap RemoveBoundaries is ingeschakeld, wordt de inhoud van de boundaries automatisch geëxtraheerd nadat de volledige stroom is ontvangen.

Voorbeeldcode

Maak eerst een nieuwe serverinstantie aan en stel in dat de stromen als bestandsstromen worden opgeslagen.


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

Maak vervolgens een nieuw HTML-bestand aan met de volgende configuratie

<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>

Open tot slot het HTML-bestand in een webbrowser en stuur een bestand naar de server. De server maakt een nieuwe bestandsstroom aan met de extensie ".sgc_ps" en wanneer de stroom volledig is ontvangen, wordt het bestand uit de boundaries geëxtraheerd.

Gebeurtenissen

Er zijn 2 gebeurtenissen waarmee u de uploadbestandsstroom kunt aanpassen (vereist dat de eigenschap HTTPUploadFiles.RemoveBoundaries is ingeschakeld)

OnHTTPUploadBeforeSaveFile

Deze gebeurtenis wordt geactiveerd VOORDAT het bestand wordt opgeslagen en maakt het mogelijk de naam van het ontvangen bestand aan te passen.


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

OnHTTPUploadAfterSaveFile

Deze gebeurtenis wordt geactiveerd NADAT het bestand is opgeslagen en geeft u de naam van het opgeslagen bestand.


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

OnHTTPUploadReadInput

Deze gebeurtenis wordt geactiveerd wanneer de decoder een invoerwaarde leest die verschilt van de bestandsinvoer (bijvoorbeeld: als het formulier variabelen bevat zoals naam, datum...).


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