Supportato da
Quando un client HTTP invia uno stream multipart/form-data, lo stream viene salvato dal server in memoria. Quando i file sono grandi, il server può generare un'eccezione di memoria esaurita. Per evitare queste eccezioni, il server dispone di una proprietà denominata HTTPUploadFiles con cui è possibile configurare come vengono gestiti gli stream POST: in memoria oppure come file stream. Se gli stream vengono gestiti come file stream, gli stream ricevuti vengono memorizzati direttamente nel disco rigido, evitando così i problemi di memoria.
Per configurare il server affinché salvi gli stream multipart/form-data come file stream, seguire i passaggi successivi:
1. Impostare la proprietà HTTPUploadFiles.StreamType = pstFileStream. Con questa configurazione, il server memorizzerà questi stream nel disco rigido.
2. È possibile configurare quale sia la dimensione minima in byte a partire dalla quale i file verranno memorizzati come file stream. Per impostazione predefinita il valore è zero, il che significa che tutti gli stream verranno memorizzati come file stream.
3. La cartella in cui vengono memorizzati gli stream tramite SaveDirectory; se non impostata, verranno memorizzati nella stessa cartella in cui si trova l'applicazione.
4. Quando un client invia un multipart/form-data, il contenuto viene codificato all'interno di boundaries; se la proprietà RemoveBoundaries è abilitata, il contenuto dei boundaries verrà estratto automaticamente dopo la ricezione completa dello stream.
Codice di esempio
Innanzitutto creare una nuova istanza del server e impostare che gli stream vengano salvati come file stream.
oServer := TsgcWebSocketHTTPServer.Create(nil);
oServer.Port := 5555;
oServer.HTTPUploadFiles.StreamType := pstFileStream;
oServer.Active := True;
Quindi creare un nuovo file html con la seguente configurazione
<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>
Infine aprire il file html con un browser web e inviare un file al server. Il server creerà un nuovo file stream con l'estensione ".sgc_ps" e, una volta ricevuto completamente lo stream, estrarrà il file dai boundaries.
Esistono 2 eventi che possono essere utilizzati per personalizzare il flusso di upload dei file (richiede che la proprietà HTTPUploadFiles.RemoveBoundaries sia abilitata)
OnHTTPUploadBeforeSaveFile
Questo evento viene attivato PRIMA che il file venga salvato e consente di personalizzare il nome del file ricevuto.
procedure OnHTTPUploadBeforeSaveFileEvent(Sender: TObject; var aFileName: string; var aFilePath: string);
begin
if aFileName = "test.jpg" then
aFileName := "custom_test.jpg";
end;
OnHTTPUploadAfterSaveFile
Questo evento viene attivato DOPO che il file è stato salvato e consente di conoscere il nome del file salvato.
procedure OnHTTPUploadBeforeSaveFileEvent(Sender: TObject; const aFileName: string; const aFilePath: string); begin DoLog("File Received: " + aFileName);end;
OnHTTPUploadReadInput
Questo evento viene attivato quando il decodificatore legge un valore di input ricevuto diverso dall'input file (esempio: se il form contiene alcune variabili come nome, data...).
procedure OnHTTPUploadReadInputEvent(Sender: TObject; const aName: string; const aValue: string); begin DoLog("Input value received: " + aName + ":" + aValue);end;