Wysyłanie dużych plików

Obsługiwane przez

 

TsgcWebSocketHTTPServer

TsgcWebSocketServer_HTTPAPI

 

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ść o nazwie HTTPUploadFiles, w której można skonfigurować sposób obsługi strumieni POST: w pamięci lub jako strumienie plików. Jeśli strumienie są obsługiwane jako strumienie plików, odebrane strumienie są zapisywane bezpośrednio na dysku twardym, dzięki czemu unika się problemów z pamięcią.

 

Aby skonfigurować serwer do zapisywania strumieni multipart/form-data jako strumieni plików, wykonaj następujące kroki:

 

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

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

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

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

 

Przykładowy kod

 

Najpierw utwórz nową instancję serwera i ustaw zapisywanie strumieni jako strumieni plików.

 


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

Następnie utwórz nowy plik html z następującą 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" accept-charset="UTF-8">

<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ń pliku z rozszerzeniem „.sgc_ps”, a gdy strumień zostanie w pełni odebrany, wyodrębni plik z granic.

 

Zdarzenia

Istnieją 2 zdarzenia, których można użyć do dostosowania przepływu wysyłania plików (wymaga włączenia właściwości HTTPUploadFiles.RemoveBoundaries)

 

OnHTTPUploadBeforeSaveFile

 

To zdarzenie jest zgłaszane PRZED zapisaniem pliku i umożliwia dostosowanie nazwy odebranego pliku.


procedure OnHTTPUploadBeforeSaveFileEvent(Sender: TObject; var aFileName: string; var aFilePath: string);
begin
  if aFileName = "test.jpg" then
    aFileName := "custom_test.jpg";
end;

OnHTTPUploadAfterSaveFile

 

To zdarzenie jest zgłaszane PO zapisaniu pliku i umożliwia poznanie nazwy zapisanego pliku.


procedure OnHTTPUploadBeforeSaveFileEvent(Sender: TObject; const aFileName: string; const aFilePath: string);
begin
  DoLog("File Received: " + aFileName);end;

 

OnHTTPUploadReadInput

 

To zdarzenie jest zgłaszane, gdy dekoder odczyta wartość wejściową inną niż wejście pliku (przykład: jeśli formularz zawiera zmienne takie jak nazwa, data...).


procedure OnHTTPUploadReadInputEvent(Sender: TObject; const aName: string; const aValue: string);
begin
  DoLog("Input value received: " + aName + ":" + aValue);end;