지원 대상
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" 확장자를 가진 새 파일 스트림을 만들고, 스트림이 완전히 수신되면 경계에서 파일을 추출합니다.
업로드 파일 흐름을 사용자 지정하는 데 사용할 수 있는 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);
}