大容量ファイルの送信

サポートコンポーネント

TsgcWebSocketHTTPServer

TsgcWebSocketServer_HTTPAPI

HTTP クライアントが multipart/form-data ストリームを送信すると、サーバーはそのストリームをメモリ上に保存します。ファイルが大きい場合、サーバーでメモリ不足の例外が発生することがあります。この例外を回避するために、サーバーには HTTPUploadFiles プロパティが用意されており、POST ストリームの処理方法(メモリ上またはファイルストリームとして)を設定できます。ストリームをファイルストリームとして処理するように設定すると、受信したストリームはハードディスクに直接保存されるため、メモリの問題を回避できます。

サーバーで multipart/form-data ストリームをファイルストリームとして保存するには、次の手順に従ってください。

1. プロパティ HTTPUploadFiles.StreamType = pstFileStream を設定します。この設定により、サーバーはストリームをハードディスクに保存します。

2. ファイルストリームとして保存する最小サイズ(バイト単位)を設定できます。デフォルト値はゼロで、すべてのストリームがファイルストリームとして保存されます。

3. SaveDirectory を使用してストリームの保存先フォルダーを指定します。指定しない場合は、アプリケーションと同じフォルダーに保存されます。

4. クライアントが multipart/form-data を送信すると、コンテンツはバウンダリー内にエンコードされます。プロパティ RemoveBoundaries を有効にすると、ストリームの受信が完了した後にバウンダリーの内容が自動的に抽出されます。

サンプルコード

まず新しいサーバーインスタンスを作成し、ストリームがファイルストリームとして保存されるよう設定します。


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

次に、以下の内容で新しい HTML ファイルを作成します。

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

最後に、ウェブブラウザーで HTML ファイルを開き、サーバーにファイルを送信します。サーバーは拡張子「.sgc_ps」の新しいファイルストリームを作成し、ストリームの受信が完了するとバウンダリーからファイルを抽出します。

イベント

アップロードファイルのフローをカスタマイズするために使用できる 2 つのイベントがあります(プロパティ HTTPUploadFiles.RemoveBoundaries が有効である必要があります)。

OnHTTPUploadBeforeSaveFile

このイベントはファイルが保存される前に発生し、受信したファイルの名前をカスタマイズできます。


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

OnHTTPUploadAfterSaveFile

このイベントはファイルが保存された後に発生し、保存されたファイルの名前を取得できます。


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

OnHTTPUploadReadInput

このイベントは、デコーダーがファイル入力以外の入力値(例:フォームに名前や日付などの変数がある場合)を受信したときに発生します。


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