HTTP Post de archivos grandes

· Características

Los servidores sgcWebSockets permiten hacer Post de archivos grandes sin afectar a la memoria del servidor. 

Cuando un cliente HTTP envía un stream multipart/form-data, el stream lo guarda el servidor en memoria. Cuando los archivos son grandes, el servidor puede sufrir una excepción de memoria agotada; para evitar estas excepciones, el servidor tiene una propiedad llamada HTTPUploadFiles donde puedes configurar cómo se gestionan los streams POST: en memoria o como streams de archivo. Si los streams se gestionan como streams de archivo, los streams recibidos se almacenan directamente en el disco duro, evitando así los problemas de memoria.

Configuración del servidor 

Para configurar tu servidor para que guarde los streams multipart/form-data como streams de archivo, sigue los siguientes pasos:

1. Establece la propiedad HTTPUploadFiles.StreamType = pstFileStream. Con esta configuración, el servidor almacenará estos streams en el disco duro.

2. Puedes configurar cuál es el tamaño mínimo en bytes a partir del cual los archivos se almacenarán como stream de archivo. Por defecto el valor es cero, lo que significa que todos los streams se almacenarán como stream de archivo.

3. La carpeta donde se almacenan los streams se configura con SaveDirectory; si no se establece, se almacenarán en la misma carpeta donde está la aplicación.

4. Cuando un cliente envía un multipart/form-data, el contenido está codificado dentro de boundaries; si la propiedad RemoveBoundaries está activada, el contenido de los boundaries se extraerá automáticamente después de recibir el stream completo. 

Código de ejemplo

// First create a new server instance and set the Streams are saved as File Streams.
oServer := TsgcWebSocketHTTPServer.Create(nil);
oServer.Port := 5555;
oServer.HTTPUploadFiles.StreamType := pstFileStream;
oServer.Active := True;
// Then create a new html file with the following configuration
<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">
            <input type="file" name="file_1" />
            <input type="submit" />
        </form>
    </body>
</html>
// Finally open the html file with a web browser and send a file to the server. 
// The server will create a new file stream with the extension ".sgc_ps" and when the stream is fully received, 
// it will extract the file from the boundaries.