큰 파일 전송

지원 대상

 

TsgcWebSocketHTTPServer

TsgcWebSocketServer_HTTPAPI

 

HTTP 클라이언트가 multipart/form-data 스트림을 보내면 해당 스트림은 서버에 의해 메모리에 저장됩니다. 파일이 큰 경우 서버에서 out of memory 예외가 발생할 수 있습니다. 이러한 예외를 방지하기 위해 서버에는 HTTPUploadFiles라는 속성이 있으며, 이를 통해 POST 스트림을 메모리에서 처리할지 파일 스트림으로 처리할지 구성할 수 있습니다. 스트림이 파일 스트림으로 처리되면 수신된 스트림은 하드 디스크에 직접 저장되므로 메모리 문제를 방지할 수 있습니다.

 

multipart/form-data 스트림을 파일 스트림으로 저장하도록 서버를 구성하려면 다음 단계를 따르십시오:

 

1. HTTPUploadFiles.StreamType = pstFileStream 속성을 설정하십시오. 이 설정을 사용하면 서버는 이러한 스트림을 하드 디스크에 저장합니다.

2. 파일이 파일 스트림으로 저장되는 최소 크기(바이트)를 구성할 수 있습니다. 기본값은 0이며, 이는 모든 스트림이 파일 스트림으로 저장됨을 의미합니다.

3. 스트림이 저장되는 폴더는 SaveDirectory를 사용하여 지정하며, 설정하지 않으면 애플리케이션이 있는 폴더와 동일한 폴더에 저장됩니다.

4. 클라이언트가 multipart/form-data를 보내면 콘텐츠는 경계(boundary) 내부에 인코딩되며, RemoveBoundaries 속성이 활성화되어 있으면 전체 스트림이 수신된 후 경계의 콘텐츠가 자동으로 추출됩니다.

 

샘플 코드

 

먼저 새 서버 인스턴스를 만들고 스트림이 파일 스트림으로 저장되도록 설정하십시오.

 


TsgcWebSocketHTTPServer *oServer = new TsgcWebSocketHTTPServer();
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" 확장자를 가진 새 파일 스트림을 만들고, 스트림이 완전히 수신되면 경계에서 파일을 추출합니다.

 

Events

업로드 파일 흐름을 사용자 지정하는 데 사용할 수 있는 2개의 이벤트가 있습니다(HTTPUploadFiles.RemoveBoundaries 속성이 활성화되어 있어야 함).

 

OnHTTPUploadBeforeSaveFile

 

이 이벤트는 파일이 저장되기 전에 발생하며 수신된 파일의 이름을 사용자 지정할 수 있도록 합니다.


void OnHTTPUploadBeforeSaveFileEvent(TObject *Sender, String &aFileName, String &aFilePath)
{
  if (aFileName == "test.jpg")
  {
    aFileName = "custom_test.jpg";
  }
}

OnHTTPUploadAfterSaveFile

 

이 이벤트는 파일이 저장된 후에 발생하며 저장된 파일의 이름을 알 수 있도록 합니다.


void OnHTTPUploadBeforeSaveFileEvent(TObject *Sender, string aFileName, string aFilePath)
{
  DoLog("File Received: " + aFileName);
}

 

OnHTTPUploadReadInput

 

이 이벤트는 디코더가 파일 입력과 다른 입력 값을 수신했을 때 발생합니다(예: 폼에 name, date... 같은 변수가 있는 경우).


void OnHTTPUploadReadInputEvent(TObject *Sender, string aName, string aValue)
{
  DoLog("Input value Received: " + aName + ":" + aValue);
}