HTTP Post: arquivos grandes

· Recursos

Os servidores sgcWebSockets permitem o envio de arquivos grandes via POST sem afetar a memória do servidor.

Quando um cliente HTTP envia um stream multipart/form-data, o stream é salvo pelo servidor em memória. Quando os arquivos são grandes, o servidor pode gerar uma exceção de falta de memória. Para evitar essas exceções, o servidor possui uma propriedade chamada HTTPUploadFiles onde você pode configurar como os streams POST são tratados: em memória ou como streams de arquivo. Se tratados como streams de arquivo, os streams recebidos são armazenados diretamente no disco rígido, evitando os problemas de memória.

Configuração do servidor

Para configurar seu servidor para salvar streams multipart/form-data como streams de arquivo, siga os passos abaixo:

1. Defina a propriedade HTTPUploadFiles.StreamType = pstFileStream. Com essa configuração, o servidor armazenará esses streams no disco.

2. Você pode configurar o tamanho mínimo em bytes a partir do qual os arquivos serão armazenados como stream de arquivo. Por padrão o valor é zero, o que significa que todos os streams serão armazenados como stream de arquivo.

3. A pasta onde os streams são armazenados é definida com SaveDirectory; se não for definida, os streams serão salvos na mesma pasta da aplicação.

4. Quando um cliente envia um multipart/form-data, o conteúdo é codificado dentro de boundaries. Se a propriedade RemoveBoundaries estiver habilitada, o conteúdo dos boundaries será extraído automaticamente após o recebimento completo do stream.

Código de exemplo

// 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.