• Multipart 란
    • 여러종류의 데이터를 여러부분으로 나누어 보낼 때 사용하는 Content-type
    • Form 전송은 여러 종류의 데이터를 한번에 보낼 수 있음
    • 파일 업로드 상황에서 한 요청의 Body에 두 종류 이상의 데이터를 구분해서 넣어주는 방법이 필요하여 생긴 Content-type
      • 예를 들어 이미지(image/jpeg) + 이미지 설명(application/x-www-form-urlencoded)

  • multipart/form-data 메시지 구성 방법
    • Request Header 에 Content-type : multipart/form-data ; {Boundary} 로 구성
    • Boundary 문자열은 메시지 페이로드를 각 파트로 구분하는 구분자
    • {개행} Boundary 문자열 {개행} 으로 구분 되며 개행에는 반드시 " \r\n" 을 사용해야 함
    • 각 데이터 구분 값은 -- 로 시작해야 하며 설정한 boundary 앞에 -- 를 붙여 구분, 모든 파트가 끝나면 구분자 뒤에 -- 를 추가하여 마무리
    • 각 파트에는 헤더가 들어가며 Content-Disposition:form-data; name=" ..." 와 같은 폼 필드의 정보를 추가





※ POSTMAN 으로 호출한 Request Body Example (w. Wireshark)

Request body 의 form-data 기능을 사용하여 호출하면 편리하지만
커스텀 boundary 설정 및 raw 데이터 호출을 통해 multipart/form-data 요청 상세 확인

Request Header 세팅

Content-type : multipart/form-data; boundary=--------------------------297662709069591385314322
Note. multipart/form-data 는 boundary 값이 필요하며, 세미콜론(;)로 구분, 데이터 구분 바운더리값은 반드시 설정한 boundary에 -- 값을 붙여 시작


Request Body 예시 - raw 사용 시
form-data 를 사용해도 되지만, raw 사용시 다음과 같이 /r/n이 제거된 상태로 호출 되어야 함.

Note. 개행은 반드시 \r\n 으로 구분, 각 데이터 바운더리는 "--" + "boundary 값" 으로 설정하며, Last boundary 는 구분 바운더리 값에 -- 를 추가하여 마무리 ("--" + "boundary 값" + "--")


POST /invoke/BOX_TEST:multipart HTTP/1.1
User-Agent: PostmanRuntime/7.32.3
Accept: */*
Postman-Token: a4ae8d3b-3f16-4c76-9542-80041108a45f
Host: 192.168.1.51:5555
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Content-Type: multipart/form-data; boundary=--------------------------297662709069591385314322

Content-Length: 353

----------------------------297662709069591385314322
Content-Disposition: form-data; name="key1"; filename="test.json"
Content-Type: application/json
{
"testKey" : "testValue"
}
----------------------------297662709069591385314322
Content-Disposition: form-data; name="key2"
test1
----------------------------297662709069591385314322--


[추가 예시] 다중 파일 업로드 요청 시 서버 수신 HTTP 메시지 내용 예시 (다중 이미지 업로드)
POST /submit HTTP/1.1
Host:my.server.com
User-Agent: Mozilla/5.0 Gecko/2009042316 FireFox/3.0.10
Accept: text/html,application/xhtml+html,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Referer: http://my.server.com/test/index.html
Content-type: multipart/form-data; boundary=myboudnaryvalue
Content-length: 514

--myboudnaryvalue
Content-Disposition: form-data; name="datafiled1"; filename="r.gif"
Content-Type: image/gif
GIF871...............................D..;

--myboudnaryvalue
Content-Disposition: form-data; name="datafiled1"; filename="g.gif"
Content-Type: image/gif
GIF87a...............................D..;

--myboudnaryvalue
Content-Disposition: form-data; name="datafiled1"; filename="b.gif"
Content-Type: image/gif
GIF87a...............................D..;
--myboudnaryvalue--