Ondersteund door
Wanneer een HTTP-client een multipart/form-data-stream verstuurt, wordt de stream door de server in het geheugen opgeslagen. Wanneer de bestanden groot zijn, kan de server een out of memory-uitzondering krijgen. Om deze uitzonderingen te voorkomen, heeft de server een eigenschap genaamd HTTPUploadFiles waarmee u kunt configureren hoe de POST-streams worden verwerkt: in het geheugen of als bestandsstreams. Als de streams als bestandsstreams worden verwerkt, worden de ontvangen streams rechtstreeks op de harde schijf opgeslagen, zodat de geheugenproblemen worden voorkomen.
Volg de volgende stappen om uw server te configureren om multipart/form-data-streams als bestandsstreams op te slaan:
1. Stel de eigenschap HTTPUploadFiles.StreamType = pstFileStream in. Met deze instelling zal de server deze streams op de harde schijf opslaan.
2. U kunt configureren wat de minimale grootte in bytes is waarbij de bestanden als bestandsstream worden opgeslagen. Standaard is de waarde nul, wat betekent dat alle streams als bestandsstream worden opgeslagen.
3. De map waar de streams worden opgeslagen met SaveDirectory; indien niet ingesteld, worden ze opgeslagen in dezelfde map waar de toepassing zich bevindt.
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 stream is ontvangen.
Voorbeeldcode
Maak eerst een nieuwe serverinstantie aan en stel in dat de streams als bestandsstreams worden opgeslagen.
TsgcWebSocketHTTPServer *oServer = new TsgcWebSocketHTTPServer();
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 ten slotte het html-bestand met een webbrowser en stuur een bestand naar de server. De server zal een nieuwe bestandsstream aanmaken met de extensie ".sgc_ps" en wanneer de stream volledig is ontvangen, zal hij het bestand uit de boundaries extraheren.
Er zijn 2 gebeurtenissen die kunnen worden gebruikt om de upload-bestandsflow aan te passen (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.
void OnHTTPUploadBeforeSaveFileEvent(TObject *Sender, String &aFileName, String &aFilePath)
{
if (aFileName == "test.jpg")
{
aFileName = "custom_test.jpg";
}
}
OnHTTPUploadAfterSaveFile
Deze gebeurtenis wordt geactiveerd NADAT het bestand is opgeslagen en stelt u in staat de naam van het opgeslagen bestand te kennen.
void OnHTTPUploadBeforeSaveFileEvent(TObject *Sender, string aFileName, string aFilePath)
{
DoLog("File Received: " + aFileName);
}
OnHTTPUploadReadInput
Deze gebeurtenis wordt geactiveerd wanneer de decoder een ontvangen invoerwaarde leest die anders is dan de bestandsinvoer (bijvoorbeeld: als het formulier enkele variabelen heeft zoals name, date...).
void OnHTTPUploadReadInputEvent(TObject *Sender, string aName, string aValue)
{
DoLog("Input value Received: " + aName + ":" + aValue);
}