Wysyłanie dużych plików przez HTTP POST

· Funkcje

Serwery sgcWebSockets umożliwiają wysyłanie dużych plików przez POST bez wpływu na pamięć serwera. 

Gdy klient HTTP wysyła strumień multipart/form-data, strumień jest zapisywany przez serwer w pamięci. Gdy pliki są duże, serwer może otrzymać wyjątek out of memory. Aby uniknąć tych wyjątków, serwer udostępnia właściwość HTTPUploadFiles, w której można skonfigurować sposób obsługi strumieni POST: w pamięci lub jako strumienie plikowe. Jeśli strumienie są obsługiwane jako strumienie plikowe, otrzymane strumienie są zapisywane bezpośrednio na dysku twardym, dzięki czemu unika się problemów z pamięcią.

Konfiguracja serwera 

Aby skonfigurować serwer tak, aby zapisywał strumienie multipart/form-data jako strumienie plikowe, wykonaj następujące kroki:

1. Ustaw właściwość HTTPUploadFiles.StreamType = pstFileStream. Przy tej konfiguracji serwer zapisze te strumienie na dysku twardym.

2. Możesz skonfigurować minimalny rozmiar w bajtach, od którego pliki będą zapisywane jako strumień plikowy. Domyślnie wartość wynosi zero, co oznacza, że wszystkie strumienie będą zapisywane jako strumień plikowy.

3. Folder, w którym strumienie są zapisywane, ustawia się za pomocą SaveDirectory; jeśli nie jest ustawiony, będą zapisywane w tym samym folderze, w którym znajduje się aplikacja.

4. Gdy klient wysyła multipart/form-data, zawartość jest zakodowana wewnątrz granic (boundaries). Jeśli właściwość RemoveBoundaries jest włączona, zawartość granic zostanie wyodrębniona automatycznie po otrzymaniu pełnego strumienia. 

Przykładowy kod

// Najpierw utwórz nową instancję serwera i ustaw, że strumienie są zapisywane jako strumienie plikowe.
oServer := TsgcWebSocketHTTPServer.Create(nil);
oServer.Port := 5555;
oServer.HTTPUploadFiles.StreamType := pstFileStream;
oServer.Active := True;
// Następnie utwórz nowy plik html z poniższą konfiguracją
<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>
// Na koniec otwórz plik html w przeglądarce internetowej i wyślij plik do serwera.
// Serwer utworzy nowy strumień plikowy z rozszerzeniem ".sgc_ps", a gdy strumień zostanie w pełni odebrany,
// wyodrębni plik z granic (boundaries).