홍철없는 홍철팀.
웹페이지의 form(<input type='file'/>)을 통해 업로드한 파일을 받아 처리하는 API가 있을 때 파일 없이 String Data
를 그 파일의 내용인 것 처럼 보낼 순 없을까?
당연히 가능하다.
일반적인 파일 전송을 curl 코드로 보면 아래와 같다.
curl --location --request POST 'http://0.0.0.0:3337
--form 'f=@"/Users/velog/text.txt"'
당연히 서버측에 로컬 컴퓨터에 있는 파일 주소를 보내는 것은 아니고, curl 프로그램이 파일 관련 Tag인 F=@
혹은 --file =
등을 만나면 약속된 규약으로 바꾸어 보내는데, 그 규약은 아래 링크에 정리되어있다.
https://tools.ietf.org/html/rfc2046#section-5.1.1
Boundary 설정법
규약 내용을 읽어보면 파일을 전송하기위해 multipart/formdata
와 Boundary
에 대한 내용이 나오는데, 대략적인 방법은 아래와 같다.
content-type
을 multipart/form-data
로 지정하고, boundary
명을 지정해 준다.Content-Disposition
과 Content-Type
에 대한 정의가 필요하다. +a 컨텐츠 내용의 줄바꿈은 \r
\n
으로 표현한며, 컨텐츠의 내용이 반드시 ASCII로 이루어질 필요는 없다.
Curl 형태의 예시
curl --location --request POST 'https://test.com
--header 'content-type: multipart/form-data; boundary=--9546' \
--data-raw '--9546
Content-Disposition: form-data; name="file"; filename="main.c"
Content-Type: application/octet-stream
#include <stdio.h>
int main (void){
return 0;
}
--9546--
위와 같이 Body와 Header를 설정하고, 서버측에서 request를 받아보면 form을 통해 파일을 전송했을 때와 똑같이 파일을 처리할 수 있는 것을 확인할 수 있을 것이다. (물론 proxy툴을 통해 HTTP통신을 capture해 보아도 Boundary명만 제외하면 내용이 같은 것을 확인할 수 있다.)
출처
https://tools.ietf.org/html/rfc2046#section-5.1.1
https://developer.mozilla.org/ko/docs/Web/HTTP/Methods/POST
https://developer.mozilla.org/ko/docs/Web/HTTP/Headers/Content-Disposition