Ondersteund door
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.
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;