간단한 이해
Disposition이란 기질, 성향, 배치, 배열 이란 뜻이다.
HTTP Response Header에 들어가는 Content-Disposition은 HTTP Response Body에 오는 컨텐츠의 기질/성향을 알려주는 속성이다.
default
값은 inline
으로 web에 전달되는 data라고 생각하면 된다.
특수한 경우는 Content-Disposition에 attachment를 주는 경우로, 이때 filename과 함께 주게 되면 Body에 오는 값을 다운로드 받으라는 뜻이 된다.
Content-Disposition: attachment; filename="hello.jpg"
"는 서버측에서 header를 설정할 때 붙이지 않아도 되는 듯 하다
multipart
만약 Body에 담길 data가 커서 HTTP response가 여러 번 나가야 한다면(multipart) 아래와 같은 형식으로 나가게 된다.
첫 번째 Response Header
Content-Type: multipart/form-data;boundary="boundary"
두 번째 Response Header
Content-Disposition: form-data; name="field1"
세 번째 Response Header
Content-Disposition: form-data; name="field2"; filename="example.txt"
궁금증
여기서 생긴 궁금증... HTTP body는 용량제한이 없어도 (브라우저나 서버에서 정한 미니멈이 사실상 제한이 될 것!) HTTP를 있게 해주는 Transport layer나 Network layer에서 payload 제한이 있을텐데 HTTP단에서 패킷 순서를 받아서 한 번에 보여주는건가...?
실험을 위해 1,000byte, 100,000byte 100,000byte 1,000,000 byte를 한 번 보내보자!
백엔드 / 프론트 구현
back은 간단하게 spring boot로 작성했다.
package com.lannstark.httptest;
import org.springframework.http.HttpHeaders;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class MainController {
@RequestMapping(value = "/test1", method = RequestMethod.GET)
public ResponseEntity<String> getTest1File() {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 1000; i++) {
sb.append("A");
}
HttpHeaders headers = new HttpHeaders();
headers.add("Content-Disposition", "attachment; filename=test1.txt");
return ResponseEntity
.ok()
.headers(headers)
.body(sb.toString());
}
}
프론트는 index.html 하나만 만들어서 브라우저에서 열면 된다.
<a href="http://localhost:8080/test1">여기!</a>
1,000 bytes
Content-Length 1000으로 잘 온 것을 확인할 수 있다.
10,000 bytes
이번에도 잘 왔다.
100,000 bytes
100kb라면 어떨까!
너무 잘온다...
1,000,000 bytes
굳이 캡쳐하지 않아도 아주 잘온다...
10,000,000 bytes
마찬가지...
10mb파일을 전송할 때도, multipart는 사용하지도 않았다. 정말 큰 용량의 파일을 다룰 때 사용하나보다