Obsługiwane przez
Gdy klient HTTP wysyła strumień multipart/form-data, strumień jest zapisywany przez serwer w pamięci. W przypadku dużych plików serwer może zgłosić wyjątek braku pamięci. Aby uniknąć tych wyjątków, serwer posiada 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, odebrane strumienie są zapisywane bezpośrednio na dysku twardym, co pozwala uniknąć problemów z pamięcią.
Aby skonfigurować serwer do zapisywania strumieni multipart/form-data jako strumieni plikowych, należy wykonać następujące kroki:
1. Ustawić właściwość HTTPUploadFiles.StreamType = pstFileStream. Przy tej konfiguracji serwer będzie zapisywał strumienie na dysku twardym.
2. Można skonfigurować minimalny rozmiar w bajtach, od którego pliki będą zapisywane jako strumień plikowy. Domyślna wartość wynosi zero, co oznacza, że wszystkie strumienie będą zapisywane jako strumień plikowy.
3. Folder, w którym strumienie są zapisywane, określa właściwość SaveDirectory. Jeśli nie zostanie ustawiona, strumienie 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 odebraniu pełnego strumienia.
Przykładowy kod
Najpierw należy utworzyć nową instancję serwera i ustawić zapisywanie strumieni jako strumienie plikowe.
oServer := TsgcWebSocketHTTPServer.Create(nil);
oServer.Port := 5555;
oServer.HTTPUploadFiles.StreamType := pstFileStream;
oServer.Active := True;
Następnie należy utworzyć nowy plik HTML o następującej konfiguracji
<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 należy otworzyć plik HTML w przeglądarce internetowej i wysłać plik do serwera. Serwer utworzy nowy strumień plikowy z rozszerzeniem ".sgc_ps", a po pełnym odebraniu strumienia wyodrębni plik z granic.
Dostępne są 2 zdarzenia umożliwiające dostosowanie procesu przesyłania pliku (wymaga włączenia właściwości HTTPUploadFiles.RemoveBoundaries)
OnHTTPUploadBeforeSaveFile
Zdarzenie jest wywoływane 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
Zdarzenie jest wywoływane PO zapisaniu pliku i pozwala uzyskać informację o nazwie zapisanego pliku.
procedure OnHTTPUploadBeforeSaveFileEvent(Sender: TObject; const aFileName: string; const aFilePath: string); begin DoLog("File Received: " + aFileName);end;
OnHTTPUploadReadInput
Zdarzenie jest wywoływane, gdy dekoder odczytuje wartość wejściową inną niż wejście plikowe (na przykład gdy 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;