Inviare file di grandi dimensioni tramite POST

Supportato da

TsgcWebSocketHTTPServer

TsgcWebSocketServer_HTTPAPI

Quando un client HTTP invia uno stream multipart/form-data, lo stream viene salvato dal server in memoria. Quando i file sono di grandi dimensioni, il server può generare un'eccezione out of memory. Per evitare queste eccezioni, il server dispone di una proprietà chiamata HTTPUploadFiles con cui è possibile configurare come gli stream POST vengono gestiti: in memoria o come file stream. Se gli stream vengono gestiti come file stream, gli stream ricevuti vengono memorizzati direttamente sul disco rigido, evitando così i problemi di memoria.

Per configurare il Suo server in modo che salvi gli stream multipart/form-data come file stream, segua i passaggi successivi:

1. Imposti la proprietà HTTPUploadFiles.StreamType = pstFileStream. Con questa configurazione, il server memorizzerà questi stream sul 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 gli stream vengono memorizzati si indica 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 è codificato all'interno di boundary; se la proprietà RemoveBoundaries è abilitata, il contenuto dei boundary verrà estratto automaticamente dopo che lo stream completo è stato ricevuto.

Codice di esempio

Per prima cosa crei una nuova istanza del server e imposti che gli Stream vengano salvati come File Stream.


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

Quindi crei 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 apra il file html con un browser web e invii un file al server. Il server creerà un nuovo file stream con l'estensione ".sgc_ps" e, quando lo stream sarà stato ricevuto completamente, estrarrà il file dai boundary.

Eventi

Esistono 2 eventi che possono essere utilizzati per personalizzare il flusso di caricamento dei file (richiede che la proprietà HTTPUploadFiles.RemoveBoundaries sia abilitata)

OnHTTPUploadBeforeSaveFile

Questo evento viene generato 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 generato DOPO che il file è stato salvato e Le 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 generato quando il decoder 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;