컴포넌트를 캡쳐한 이미지를 서버로 보내는 업무를 맡았다. 이미지를 서버로..?? 바이너리 개념인 Blob과 서버에 보내는 방식중 multi-formdata에 대해서 알아보자
아래처럼 배열과 타입을 넣어 객체를 생성한다
var blob = new Blob([typedArray], {type: "application/octet-binary"})
var audioBlovb = new Blob([dataView], {type:type})
아래처럼 URL을 생성할 수 있는데 이 URL을 a
태그에 연결하여 다운(서버X 브라우저O)받을 수 있다.
var reader = new FileReader();
reader.readAsArrayBuffer(blob);
//FileReader를 통해서 blob을 읽을 수 있다.
form
을 통해서 파일을 전송한다.Content-Type
속성이 multipart/form-data
로 지정되며 정해진 형식에 따라 메시지를 인코딩한다이때 이미지 파일도 문자로 이루어져있으므로 HTTP Request Body
에 이미지 파일을 문자형식으로 담아 보낸다!
name
: form의 이름, 서버로 보내질 이름값action
: form이 전송되는 서버 urlmethod
: 전송방법, default로 get.autocomplete
: 자동완성기능enctype
: 폼 데이터가 서버로 제출될때 해당 데이터가 인코딩 되는 방법을 명시한다default값으로 모든 문자들을 서버로 보내기전에 인코딩됨을 명시함
공백문자는 "+"로 변환, 나머지 문자는 인코딩하지않음을 명시
모든 문자들을 인코딩하지않음을 명시함. 이 방식은
<form>
요소가 파일이나 이미지를 서버로 전송할때 주로 사용한다. 또한 요청시POST
로 보내야한다.
<form action="/home/uploadfiles" method="post" enctype="multipart/form-data">
파일명 : <input type="file" name="myfile">
<button type="submit">제출하기</button>
</form>
Content-Type
이다만약 "이미지 + 이미지에대한 설명"과 같이 다중 데이터가 들어가야할때를 위해 multipart가 생겨났다.그런데 여기서
Content-Type
은 한가지의 타입만 명시할수있다.
const handleSubmit = (e) => {
e.preventDefault();
const formData = new FormData();
formData.append("photo", files.length && files[0].uploadedFile);
formData.append("comment", commentValue);
formData.append("content_id", classData.content_id);
axios({
method: "post",
url: process.env.REACT_APP_STREAMING_COMMENT_URL, //환경변수
data: formData,
headers: { "Content-Type": "multipart/form-data", Authorization: localStorage.getItem("access_token") }
});
setCommentValue("");
setFiles([]);
};
const handleUpload = (e) => {
e.preventDefault();
const file = e.target.files[0];
setFiles([...files, { uploadedFile: file }]);
};