{"componentChunkName":"component---src-templates-blog-post-js","path":"/vue/vue-js-파일업로드/","result":{"data":{"site":{"siteMetadata":{"title":"Bottlehs Tech Blog","description":"웹·앱·AI 개발자 전병훈(bottlehs)의 기술 블로그. AI·LLM, JavaScript·Vue, Spring Boot, 알고리즘, 블록체인 실무 가이드를 다룹니다","siteUrl":"https://www.bottlehs.dev","author":{"name":"Jeon Byung Hun","summary":"개발을 즐기는 bottlehs - Engineer, MS, AI, FE, BE, OS, IOT, Blockchain, 설계, 테스트"},"social":{"github":"bottlehs","codepen":"bottlehs"}}},"markdownRemark":{"id":"8b56bc32-33c9-59d8-9743-1811ec02bfc7","excerpt":"Vue Js 뷰 파일업로드 MIME TYPE이란 이미지나 사진 동영상 파일등은 바이너리 데이터이다. 즉 0과…","html":"<p><img src=\"/assets/vue-logo.png\" alt=\"Vue Js 뷰 파일업로드\" title=\"Vue Js 뷰 파일업로드\"></p>\n<h2 id=\"mime-type이란\" style=\"position:relative;\"><a href=\"#mime-type%EC%9D%B4%EB%9E%80\" aria-label=\"mime type이란 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>MIME TYPE이란</h2>\n<p>이미지나 사진 동영상 파일등은 바이너리 데이터이다. 즉 0과 1의 조합으로 구성되어 있다. 초기 이메일 시스템에서는 본문에 들어갈 텍스트 뿐만 아니라 첨부파일도 전송 가능하게 하기 위해서 바이너리 데이터인 첨부파일을 아스키 코드로 인코딩하는 방법을 찾아야 했다. 즉, 이메일은 아스키 코드로만 주고 받고 할 수 있었다.</p>\n<p>MIME이란 Multipurpose Internet Mail Extension 이란 뜻인데, 보면 다목적의 인터넷 메일 확장이라는 뜻이다. 즉, 바이너리 데이터인 첨부파일을 아스키 코드로 인코딩하여 본문에 덧붙이겠다는 뜻이다.(Extension의 의미)</p>\n<p>보낼때 인코딩된 바이너리 데이터(사진,이미지등)가 어떤 타입인지를 명시해야 받는 측에서 그것대로 해석 할 수 있다.</p>\n<p><img src=\"/assets/vue-fileupload-http-mime.png\" alt=\"MIME TYPE\" title=\"MIME TYPE\"></p>\n<p>보면 aaa.png라는 이미지를 마임 타입으로 변환하여 전송하고 수신자는 마임타입을 다시 원본 바이너리 데이터로 복호화 한다. 즉, 마임 타입이란 바이너리 -> 아스키 인코딩 방식이라고 보면 된다. 그리고, 그 바이너리 데이터가 어떤것이냐를 마임 타입에 명시한다. 그래야, 받는 측에서 제대로 복호화 할 수 있다.</p>\n<h2 id=\"mime-type의-구성\" style=\"position:relative;\"><a href=\"#mime-type%EC%9D%98-%EA%B5%AC%EC%84%B1\" aria-label=\"mime type의 구성 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>MIME TYPE의 구성</h2>\n<h3 id=\"개별-타입\" style=\"position:relative;\"><a href=\"#%EA%B0%9C%EB%B3%84-%ED%83%80%EC%9E%85\" aria-label=\"개별 타입 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>개별 타입</h3>\n<table>\n<thead>\n<tr>\n<th>메인타입</th>\n<th>설명</th>\n<th>서브 타입</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>text</td>\n<td>텍스트를 포함하는 모든 문서를 나타내며 이론상으로는 인간이 읽을 수 있어야 합니다</td>\n<td>text/plain, text/html, text/css, text/javascript</td>\n</tr>\n<tr>\n<td>image</td>\n<td>모든 종류의 이미지를 나타냅니다. (animated gif처럼) 애니메이션되는 이미지가 이미지 타입에 포함되긴 하지만, 비디오는 포함되지 않습니다</td>\n<td>image/gif, image/png, image/jpeg, image/bmp, image/webp</td>\n</tr>\n<tr>\n<td>audio</td>\n<td>모든 종류의 오디오 파일들을 나타냅니다.</td>\n<td>audio/midi, audio/mpeg, audio/webm, audio/ogg, audio/wav</td>\n</tr>\n<tr>\n<td>video</td>\n<td>모든 종류의 비디오 파일들을 나타냅니다.</td>\n<td>video/webm, video/ogg</td>\n</tr>\n<tr>\n<td>application</td>\n<td>모든 종류의 이진 데이터를 나타냅니다</td>\n<td>application/octet-stream, application/pkcs12, application/vnd.mspowerpoint, application/xhtml+xml, application/xml, application/pdf</td>\n</tr>\n</tbody>\n</table>\n<h3 id=\"멀티파트-타입\" style=\"position:relative;\"><a href=\"#%EB%A9%80%ED%8B%B0%ED%8C%8C%ED%8A%B8-%ED%83%80%EC%9E%85\" aria-label=\"멀티파트 타입 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>멀티파트 타입</h3>\n<table>\n<thead>\n<tr>\n<th>메인타입</th>\n<th>설명</th>\n<th>서브 타입</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>multipart</td>\n<td>여러가지 타입의 데이터들을 동시에 전송할 때 사용합니다.</td>\n<td>multipart/form-data, multipart/byteranges</td>\n</tr>\n</tbody>\n</table>\n<h2 id=\"file-api\" style=\"position:relative;\"><a href=\"#file-api\" aria-label=\"file api permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>File API</h2>\n<p>브라우저는 File API 지원 한다. 아래는 File API 를 지원 하는 웹 브라우저 이다.</p>\n<p><img src=\"/assets/vue-fileupload-file-api.png\" alt=\"File API\" title=\"File API\"></p>\n<p>File API 는 아래와 같이 정의되어 있다.</p>\n<ul>\n<li>FileList : 파일 리스트</li>\n<li>File : 파일 데이터</li>\n<li>FileReader : 파일 읽기</li>\n<li>Blob : 바이트 데이터</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"html\"><pre class=\"language-html\"><code class=\"language-html\"><span class=\"token comment\">&lt;!--html--></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>input</span> <span class=\"token attr-name\">id</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>input<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">type</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>file<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">accept</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>text/*<span class=\"token punctuation\">\"</span></span> <span class=\"token punctuation\">/></span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>script</span><span class=\"token punctuation\">></span></span><span class=\"token script\"><span class=\"token language-javascript\">\n  <span class=\"token keyword\">var</span> inputEl <span class=\"token operator\">=</span> document<span class=\"token punctuation\">.</span><span class=\"token function\">querySelector</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"#input\"</span><span class=\"token punctuation\">)</span>\n  inputEl<span class=\"token punctuation\">.</span><span class=\"token function\">addEventListener</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"change\"</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">event</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// FileList</span>\n    <span class=\"token keyword\">var</span> fileList <span class=\"token operator\">=</span> inputEl<span class=\"token punctuation\">.</span>files <span class=\"token operator\">||</span> event<span class=\"token punctuation\">.</span>target<span class=\"token punctuation\">.</span>files\n    <span class=\"token comment\">// File</span>\n    <span class=\"token keyword\">var</span> file <span class=\"token operator\">=</span> fileList<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span>\n    <span class=\"token keyword\">var</span> reader <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">FileReader</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    reader<span class=\"token punctuation\">.</span><span class=\"token function-variable function\">onload</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">progressEvent</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>progressEvent<span class=\"token punctuation\">.</span>target<span class=\"token punctuation\">.</span>result<span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span>\n    reader<span class=\"token punctuation\">.</span><span class=\"token function\">readAsText</span><span class=\"token punctuation\">(</span>file<span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</span></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>script</span><span class=\"token punctuation\">></span></span></code></pre></div>\n<p>위 예제는 input[type=file] 로 입력받은 파일을 FileReader 로 내용을 Text 로 읽는 예제다.</p>\n<h3 id=\"input-file-type\" style=\"position:relative;\"><a href=\"#input-file-type\" aria-label=\"input file type permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>input file type</h3>\n<p>기본적으로 브라우저에서는 보안상 로컬 파일에 직접 접근 할 수 없다. input[type=file] 는 브라우저에서 유저가 직접 로컬의 파일을 선택할 수 있게 도와준다. 이렇게 선택한 파일은 File 로 정의되고 FileList 에 담기게 된다. 이때 multiple 설정 여부와 관계없이 ArrayLike 형태인 FileList 로 담긴다. 파일을 선택하면 input, change EventHandler 가 발생되며, 선택된 파일은 HTMLInputElement.files 에 저장된다.</p>\n<h3 id=\"input-의-속성\" style=\"position:relative;\"><a href=\"#input-%EC%9D%98-%EC%86%8D%EC%84%B1\" aria-label=\"input 의 속성 permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>input 의 속성</h3>\n<p><code class=\"language-text\">input[type=file]</code> 은 value, accept, capture, files, multiple 속성을 갖을 수 있다.</p>\n<ul>\n<li>value [DOMString] : 파일 경로</li>\n<li>accept [MIME] : 사용 가능한 파일 종류</li>\n<li>capture [string] : 파일 캡처 방법</li>\n<li>multiple [boolean] : 여러 파일 선택 여부</li>\n<li>files [FileList] : 선택된 파일들</li>\n</ul>\n<h4 id=\"inputvalue\" style=\"position:relative;\"><a href=\"#inputvalue\" aria-label=\"inputvalue permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>input.value</h4>\n<p><code class=\"language-text\">input[type=file]</code> value 에는 파일의 경로를 가진다. 브라우저에서는 보안상 로컬 파일에 직접 접근 할 수 없으며, 로컬 파일 구조의 노출을 막고자 C:\\fakepath\\ 를 포함하여, 숨긴다. 이 경로의 브라우저마다 구현된 형태가 다를 수 있다.</p>\n<h4 id=\"inputaccept\" style=\"position:relative;\"><a href=\"#inputaccept\" aria-label=\"inputaccept permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>input.accept</h4>\n<p><code class=\"language-text\">input[type=file]</code> accept 는 선택 가능한 파일 종류를 설정할 수 있다. 파일은 , 로 구분하며, 아래와 같은 형태로 작성할 수 있다.</p>\n<ul>\n<li><code class=\"language-text\">accept=\"image/*\"</code> : png 같은 이미지파일</li>\n<li><code class=\"language-text\">accept=\"video/*\"</code> : mp4 같은 동영상파일</li>\n<li><code class=\"language-text\">accept=\"audio/*\"</code> : wav 같은 오디오파일</li>\n<li><code class=\"language-text\">accept=\".pdf, .doc, .csv\"</code> : pdf, doc, css 확장자 파일</li>\n</ul>\n<h4 id=\"inputcapture\" style=\"position:relative;\"><a href=\"#inputcapture\" aria-label=\"inputcapture permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>input.capture</h4>\n<p><code class=\"language-text\">input[type=file]</code> capture 는 모바일 같은 특정 기기에서 capture 방법을 설정할 수 있다.</p>\n<ul>\n<li><code class=\"language-text\">capture=\"camera\"</code> : 카메라</li>\n<li><code class=\"language-text\">capture=\"camcorder\"</code> : 동영상</li>\n<li><code class=\"language-text\">capture=\"microphone\"</code> : 마이크</li>\n</ul>\n<p>capture 속성을 지원하지 않는 브라우저의 경우, accept=“image/*;capture=camera” 으로 사용할 수도 있다.</p>\n<h3 id=\"filelist\" style=\"position:relative;\"><a href=\"#filelist\" aria-label=\"filelist permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>FileList</h3>\n<p><code class=\"language-text\">input.files</code> 에는 선택한 파일들을 FileList 로 가진다. FileList 는 File 들을 가지는 객체이며, <code class=\"language-text\">{ [index]: File, length: number }</code> 형태를 가진 array-like object 이다. <code class=\"language-text\">FileList[index]</code> 혹은 <code class=\"language-text\">FileList.item(index)</code> 형태로 File 에 접근할 수 있다. 이 FileList 는 Symbol(Symbol.iterator) 가 정의되어 있어, 순차적으로 참조하기 위해서, for of 를 사용할 수 있다. 혹은 <code class=\"language-text\">Array.from()</code> 로 변환하여 참조 할 수 있다.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// javascript</span>\n<span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">event</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">var</span> fileList <span class=\"token operator\">=</span> event<span class=\"token punctuation\">.</span>target<span class=\"token punctuation\">.</span>files<span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">for</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">const</span> file <span class=\"token keyword\">of</span> fileList<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// ...</span>\n  <span class=\"token punctuation\">}</span>\n  Array<span class=\"token punctuation\">.</span><span class=\"token function\">from</span><span class=\"token punctuation\">(</span>fileList<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">forEach</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">file</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// ...</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code></pre></div>\n<h3 id=\"file\" style=\"position:relative;\"><a href=\"#file\" aria-label=\"file permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>File</h3>\n<p>브라우저는 보안상 파일을 조작할 수 없다. 때문에 모든 값은 읽기 전용 이다. File 은 아래 속성을 가질 수 있다.</p>\n<ul>\n<li><strong>name</strong> : 파일 이름</li>\n<li><strong>lastModified</strong> : 파일을 마지막으로 수정한 Unix Time</li>\n<li><strong>lastModifiedDate</strong> : 파일을 마지막으로 수정한 Date 객체</li>\n<li><strong>size</strong> : 파일의 크기 (Byte 값)</li>\n<li><strong>type</strong> : MIME 유형</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">File name: \"android-logo.png\"\nlastModified: 1620010077441\nlastModifiedDate: Mon May 03 2021 11:47:57 GMT+0900 (Korean Standard Time)\nsize: 27871\ntype: \"image/png\"`</code></pre></div>\n<p>File 은 Blob 을 확장하여 구현되었다.</p>\n<h3 id=\"blob-binary-large-object\" style=\"position:relative;\"><a href=\"#blob-binary-large-object\" aria-label=\"blob binary large object permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Blob (Binary Large Object)</h3>\n<p>Blob 객체는 파일를 text 나 2진 데이터 형태로 읽을 수 있다. Blob 은 아래 속성을 가질 수 있다.</p>\n<ul>\n<li><strong>size</strong> : 파일의 크기 (Byte 값)</li>\n<li><strong>type</strong> : MIME 유형</li>\n</ul>\n<p>Blob 은 2가지 방법으로 생성할 수 있다.</p>\n<ul>\n<li><strong>new Blob(ArrayBuffer | Blob | DOMString, {type?: MIME})</strong>: Blob</li>\n<li><strong>Blob.slice(start?, end?, contentType?)</strong>: Blob\nBlob 의 바이트를 시작 및 끝 바이트 범위에서 복제해 새로운 Blob 객체를 생성하고 반환한다.</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">async</span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> textBlob <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Blob</span><span class=\"token punctuation\">(</span>\n    <span class=\"token punctuation\">[</span><span class=\"token string\">'😀test txt'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span> <span class=\"token keyword\">await</span> textBlob<span class=\"token punctuation\">.</span><span class=\"token function\">text</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token comment\">// 😀test txt</span>\n  <span class=\"token keyword\">const</span> uintBlob <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Blob</span><span class=\"token punctuation\">(</span>\n    <span class=\"token punctuation\">[</span><span class=\"token keyword\">new</span> <span class=\"token class-name\">Uint8Array</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span><span class=\"token number\">240</span><span class=\"token punctuation\">,</span> <span class=\"token number\">159</span><span class=\"token punctuation\">,</span> <span class=\"token number\">152</span><span class=\"token punctuation\">,</span> <span class=\"token number\">128</span><span class=\"token punctuation\">,</span> <span class=\"token number\">116</span><span class=\"token punctuation\">,</span> <span class=\"token number\">101</span><span class=\"token punctuation\">,</span> <span class=\"token number\">115</span><span class=\"token punctuation\">,</span> <span class=\"token number\">116</span><span class=\"token punctuation\">,</span> <span class=\"token number\">32</span><span class=\"token punctuation\">,</span> <span class=\"token number\">116</span><span class=\"token punctuation\">,</span> <span class=\"token number\">120</span><span class=\"token punctuation\">,</span> <span class=\"token number\">116</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n    <span class=\"token punctuation\">{</span><span class=\"token literal-property property\">type</span><span class=\"token operator\">:</span> <span class=\"token string\">'text/plain'</span><span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span> <span class=\"token keyword\">await</span> uintBlob<span class=\"token punctuation\">.</span><span class=\"token function\">text</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token comment\">// 😀test txt</span>\n  <span class=\"token keyword\">const</span> obj <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span> <span class=\"token literal-property property\">test</span><span class=\"token operator\">:</span> <span class=\"token string\">'😀test txt'</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">const</span> jsonBlob <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Blob</span><span class=\"token punctuation\">(</span>\n    <span class=\"token punctuation\">[</span><span class=\"token constant\">JSON</span><span class=\"token punctuation\">.</span><span class=\"token function\">stringify</span><span class=\"token punctuation\">(</span>obj<span class=\"token punctuation\">,</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n    <span class=\"token punctuation\">{</span><span class=\"token literal-property property\">type</span> <span class=\"token operator\">:</span> <span class=\"token string\">'application/json'</span><span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span> <span class=\"token keyword\">await</span> jsonBlob<span class=\"token punctuation\">.</span><span class=\"token function\">text</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token comment\">// {</span>\n  <span class=\"token comment\">//   test: 😀test txt</span>\n  <span class=\"token comment\">// }</span>\n  <span class=\"token keyword\">const</span> copyBlob1 <span class=\"token operator\">=</span> textBlob<span class=\"token punctuation\">.</span><span class=\"token function\">slice</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">const</span> copyBlob2 <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Blob</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span>copyBlob1<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span> <span class=\"token keyword\">await</span> copyBlob1<span class=\"token punctuation\">.</span><span class=\"token function\">text</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token comment\">// 😀test txt</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span> <span class=\"token keyword\">await</span> copyBlob2<span class=\"token punctuation\">.</span><span class=\"token function\">text</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token comment\">// 😀test txt</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Blob 의 내용은 3가지 방법으로 읽을 수 있다.</p>\n<ul>\n<li><strong>Blob.stream()</strong>: ReadableStream</li>\n<li><strong>Blob.text()</strong>: Promise<UTF-8></li>\n<li><strong>Blob.arrayBuffer()</strong>: Promise<ArrayBuffer></li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">event</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">var</span> file <span class=\"token operator\">=</span> event<span class=\"token punctuation\">.</span>target<span class=\"token punctuation\">.</span>files<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">(</span><span class=\"token keyword\">async</span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">blob</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">const</span> slice <span class=\"token operator\">=</span> blob<span class=\"token punctuation\">.</span><span class=\"token function\">slice</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>slice<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token comment\">// Blob {size: 12, type: \"\"}</span>\n    <span class=\"token keyword\">const</span> stream <span class=\"token operator\">=</span> blob<span class=\"token punctuation\">.</span><span class=\"token function\">stream</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>stream<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token comment\">// ReadableStream {locked: false}</span>\n    <span class=\"token keyword\">const</span> text <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> blob<span class=\"token punctuation\">.</span><span class=\"token function\">text</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>text<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token comment\">// 😀test txt</span>\n    <span class=\"token keyword\">const</span> arrayBuffer <span class=\"token operator\">=</span> <span class=\"token keyword\">await</span> blob<span class=\"token punctuation\">.</span><span class=\"token function\">arrayBuffer</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>arrayBuffer<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token comment\">// ArrayBuffer(12) {}</span>\n    <span class=\"token comment\">//   Int8Array(7498)</span>\n    <span class=\"token comment\">//   Int16Array(3749)</span>\n    <span class=\"token comment\">//   Uint8Array(7498)</span>\n    <span class=\"token comment\">//   byteLength: 7498</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">(</span>file<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code></pre></div>\n<h4 id=\"blob-readablestream-와-arraybuffer\" style=\"position:relative;\"><a href=\"#blob-readablestream-%EC%99%80-arraybuffer\" aria-label=\"blob readablestream 와 arraybuffer permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Blob ReadableStream 와 ArrayBuffer</h4>\n<p><code class=\"language-text\">Blob.stream()</code> 은 <code class=\"language-text\">ReadableStream</code> 을 반환한다. ReadableStream 은 Streams API 로 바이트 데이터 를 chunk 단위로 처리할 수 있게 도와준다. <code class=\"language-text\">ReadableStream.getReader()</code> 는 read 를 요청하고 다른 stream 이 발생되지 않도록 lock 을 건다 read() 으로 반환된 Promise 에서 값을 조회할 수 있다.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">new</span> <span class=\"token class-name\">Blob</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span><span class=\"token string\">\"😀test txt\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">.</span><span class=\"token function\">stream</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">.</span><span class=\"token function\">getReader</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">.</span><span class=\"token function\">read</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token punctuation\">{</span> value<span class=\"token punctuation\">,</span> done <span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">const</span> uint8array <span class=\"token operator\">=</span> value\n    <span class=\"token keyword\">return</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">TextDecoder</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"utf-8\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">decode</span><span class=\"token punctuation\">(</span>uint8array<span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span>console<span class=\"token punctuation\">.</span>log<span class=\"token punctuation\">)</span>\n<span class=\"token comment\">// 😀test txt</span></code></pre></div>\n<p>Blob.arrayBuffer() 는 ArrayBuffer 는 반환한다. ArrayBuffer 는 수정할 수 없는 바이트로 구성된 배열 이다. ArrayBuffer 는 TypedArray (Int8Array | Int16Array | Int32Array | Uint8Array 등) 로 변환할 수 있다.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">new</span> <span class=\"token class-name\">Blob</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span><span class=\"token string\">\"😀test txt\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">.</span><span class=\"token function\">arrayBuffer</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">arrayBuffer</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">TextDecoder</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"utf-8\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">decode</span><span class=\"token punctuation\">(</span>uint8array<span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span>console<span class=\"token punctuation\">.</span>log<span class=\"token punctuation\">)</span>\n<span class=\"token comment\">// 😀test txt</span></code></pre></div>\n<p>여기서 사용된 TextDecoder 는 텍스트를 UTF-8 | ISO-8859–2 같은 형태로 인코딩 혹은 디코딩 할 수 있게 도와주는 객체다. TextDecoder.decode() 는 ArrayBuffer 를 설정한 형태의 Text 로 decode 할 수 있다.</p>\n<h4 id=\"blob-url\" style=\"position:relative;\"><a href=\"#blob-url\" aria-label=\"blob url permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Blob URL</h4>\n<p>URL.createObjectURL 를 이용하면, Blob 객체를 가리키는 URL 을 생성할 수 있다. <a href=\"https://www.w3.org/TR/FileAPI/#blob-url\">https://www.w3.org/TR/FileAPI/#blob-url</a> URL 은 blob:${url origin}/${UUID} 로 생성된다.</p>\n<p>ex) blob:<a href=\"https://example.org/9115d58c-bcda-ff47-86e5-083e9a2153041\">https://example.org/9115d58c-bcda-ff47-86e5-083e9a2153041</a></p>\n<p>해당 URL 은 생성된 탭에서만 쓸 수 있다. Blob URL 은 페이지를 떠나기 전까지 유지되기 때문에, 필요하다면 revokeObjectURL 로 해지 해줄 수 있다.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">var</span> blob <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Blob</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span>‘😀test txt’<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">var</span> url <span class=\"token operator\">=</span> <span class=\"token constant\">URL</span><span class=\"token punctuation\">.</span><span class=\"token function\">createObjectURL</span><span class=\"token punctuation\">(</span>blob<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\nconsole<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>url<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token comment\">// blob:http://localhost:8000/a1fa84dc-fd52-4435-bc22-b1cb2a7c5d84</span>\n<span class=\"token function\">fetch</span><span class=\"token punctuation\">(</span>url<span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">res</span> <span class=\"token operator\">=></span> res<span class=\"token punctuation\">.</span><span class=\"token function\">text</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">text</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token constant\">URL</span><span class=\"token punctuation\">.</span><span class=\"token function\">revokeObjectURL</span><span class=\"token punctuation\">(</span>url<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>text<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token comment\">// 😀test txt</span>\n <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>해당 URL 은 a href 에 설정해서 다운로드 받을 수도록 설정할 수 있다. 이때 만약 <code class=\"language-text\">revokeObjectURL</code> 로 해지했다면 다운로드에 실패하게 된다.</p>\n<div class=\"gatsby-highlight\" data-language=\"html\"><pre class=\"language-html\"><code class=\"language-html\"><span class=\"token comment\">&lt;!--html--></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>a</span> <span class=\"token attr-name\">href</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>http://localhost:8000/file-path<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">download</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>file.txt<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span> download <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>a</span><span class=\"token punctuation\">></span></span></code></pre></div>\n<h4 id=\"blob-canvas-와-createimagebitmap\" style=\"position:relative;\"><a href=\"#blob-canvas-%EC%99%80-createimagebitmap\" aria-label=\"blob canvas 와 createimagebitmap permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Blob Canvas 와 createImageBitmap</h4>\n<p>Canvas 로 만든 Image 는 toBlob 으로 Blob 으로 만들 수 있다. 이때 기본 type 은 image/png 이다. CanvasRenderingContext2D.drawImage() 를 이용하면, Blob 을 Canvas 에 그릴 수 도 있다. 이때 직접적으로 Blob 을 전달할 수 없고, Image 로 변환하거나, createImageBitmap 로 ImageBitmap 를 생성해서 전달해야 한다. createImageBitmap 는 ImageData | Blob 을 전달 받아 ImageBitmap 를 생성할 수 있다.</p>\n<div class=\"gatsby-highlight\" data-language=\"html\"><pre class=\"language-html\"><code class=\"language-html\"><span class=\"token comment\">&lt;!--html--></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>canvas</span> <span class=\"token attr-name\">id</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>canvas<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">width</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>5<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">height</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>5<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>canvas</span><span class=\"token punctuation\">></span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>script</span><span class=\"token punctuation\">></span></span><span class=\"token script\"><span class=\"token language-javascript\">\n  <span class=\"token keyword\">var</span> canvas <span class=\"token operator\">=</span> document<span class=\"token punctuation\">.</span><span class=\"token function\">getElementById</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"canvas\"</span><span class=\"token punctuation\">)</span>\n  <span class=\"token keyword\">var</span> ctx <span class=\"token operator\">=</span> canvas<span class=\"token punctuation\">.</span><span class=\"token function\">getContext</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"2d\"</span><span class=\"token punctuation\">)</span>\n  <span class=\"token keyword\">var</span> dataURL <span class=\"token operator\">=</span> canvas<span class=\"token punctuation\">.</span><span class=\"token function\">toDataURL</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>dataURL<span class=\"token punctuation\">)</span>\n  <span class=\"token comment\">// data:image/png;base64,iVBORw0…</span>\n  canvas<span class=\"token punctuation\">.</span><span class=\"token function\">toBlob</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">blob</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>blob<span class=\"token punctuation\">)</span>\n    <span class=\"token comment\">// Blob {size: 72, type: \"image/png\"}</span>\n\n    <span class=\"token function\">createImageBitmap</span><span class=\"token punctuation\">(</span>blob<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">imageBitmap</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n      console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>imageBitmap<span class=\"token punctuation\">)</span>\n      <span class=\"token comment\">// ImageBitmap {width: 5, height: 5}</span>\n      ctx<span class=\"token punctuation\">.</span><span class=\"token function\">drawImage</span><span class=\"token punctuation\">(</span>img<span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n</span></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>script</span><span class=\"token punctuation\">></span></span></code></pre></div>\n<h3 id=\"filereader\" style=\"position:relative;\"><a href=\"#filereader\" aria-label=\"filereader permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>FileReader</h3>\n<p>FileReader 은 File 이나 Blob 의 내용을 읽을 수 있게 도와준다. 보안상 직접적인 Local Storage 에는 접근할 수 없다. FileReader 에는 4가지 방법으로 파일을 전달 할 수 있다.</p>\n<ul>\n<li>readAsArrayBuffer(file|blob) [ArrayBuffer]</li>\n<li>readAsBinaryString(file|blob) [0..255 범위의 문자열]</li>\n<li>readAsDataURL(file|blob) [Base64]</li>\n<li>readAsText(file|blob) [UTF-16|UTF-8 문자열]</li>\n</ul>\n<p>FileReader 에서 전달 받은 파일을 읽기 성공하면 load EventLinser 에 등록한 function 이 호출된다. 이외에 <code class=\"language-text\">loadstart | progress | loadend | error</code> 로 읽는 상태에 따라 function 이 호출 된다.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">event</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> file <span class=\"token operator\">=</span> event<span class=\"token punctuation\">.</span>target<span class=\"token punctuation\">.</span>files<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">const</span> reader <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">FileReader</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  reader<span class=\"token punctuation\">.</span><span class=\"token function-variable function\">onload</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">progressEvent</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>progressEvent<span class=\"token punctuation\">.</span>target<span class=\"token punctuation\">.</span>result<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n  reader<span class=\"token punctuation\">.</span><span class=\"token function\">readAsArrayBuffer</span><span class=\"token punctuation\">(</span>file<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token comment\">// readAsArrayBuffer ArrayBuffer(12) {}</span>\n  reader<span class=\"token punctuation\">.</span><span class=\"token function\">readAsDataURL</span><span class=\"token punctuation\">(</span>file<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token comment\">// readAsDataURL data:text/plain;base64,8J+YgHRlc3QgdHh0</span>\n  reader<span class=\"token punctuation\">.</span><span class=\"token function\">readAsBinaryString</span><span class=\"token punctuation\">(</span>file<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token comment\">// readAsBinaryString ðtest txt</span>\n  reader<span class=\"token punctuation\">.</span><span class=\"token function\">readAsText</span><span class=\"token punctuation\">(</span>file<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token comment\">// readAsText 😀test txt</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code></pre></div>\n<h3 id=\"network-와-file\" style=\"position:relative;\"><a href=\"#network-%EC%99%80-file\" aria-label=\"network 와 file permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Network 와 File</h3>\n<p>XMLHttpRequest 와 Fetch 를 이용해 Network 상의 파일을 가져올 수 있다. 이때 XMLHttpRequest.responseType 의 설정 값에 따라 응답 데이터 유형 을 설정할 수 있다. XMLHttpRequest.responseType 은 arraybuffer | blob | document | json | text 로 설정할 수 있으며 기본값을 text 이다.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">var</span> imageUrl <span class=\"token operator\">=</span> <span class=\"token string\">\"http://localhost:8080/image.png\"</span>\n<span class=\"token keyword\">var</span> xhr <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">XMLHttpRequest</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\nxhr<span class=\"token punctuation\">.</span>responseType <span class=\"token operator\">=</span> <span class=\"token string\">\"arraybuffer\"</span> <span class=\"token operator\">||</span> <span class=\"token string\">\"blob\"</span>\nxhr<span class=\"token punctuation\">.</span><span class=\"token function-variable function\">onload</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">function</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">e</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">var</span> arraybuffer <span class=\"token operator\">=</span> xhr<span class=\"token punctuation\">.</span>response <span class=\"token operator\">||</span> e<span class=\"token punctuation\">.</span>target<span class=\"token punctuation\">.</span>response\n<span class=\"token punctuation\">}</span>\nxhr<span class=\"token punctuation\">.</span><span class=\"token function\">open</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"GET\"</span><span class=\"token punctuation\">,</span> imageUrl<span class=\"token punctuation\">)</span>\nxhr<span class=\"token punctuation\">.</span><span class=\"token function\">send</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>fetch 는 응답 데이터 가 Response 객체 로 생성되어 전달된다. Response 는 4 가지 변환 할 수 있다.</p>\n<ul>\n<li>Response.arrayBuffer()</li>\n<li>Response.blob()</li>\n<li>Response.json()</li>\n<li>Response.text()</li>\n</ul>\n<p>만약 해당 형태로 변환하지 못한다면 SyntaxError 가 발생된다.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">var</span> imageUrl <span class=\"token operator\">=</span> <span class=\"token string\">\"http://localhost:8080/image.png\"</span>\n<span class=\"token function\">fetch</span><span class=\"token punctuation\">(</span>imageUrl<span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">res</span> <span class=\"token operator\">=></span> res<span class=\"token punctuation\">.</span><span class=\"token function\">blob</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span>console<span class=\"token punctuation\">.</span>log<span class=\"token punctuation\">)</span>\n<span class=\"token comment\">// Blob {size: 75677, type: \"image/png\"}</span>\n<span class=\"token function\">fetch</span><span class=\"token punctuation\">(</span>imageUrl<span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">res</span> <span class=\"token operator\">=></span> res<span class=\"token punctuation\">.</span><span class=\"token function\">arrayBuffer</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span>console<span class=\"token punctuation\">.</span>log<span class=\"token punctuation\">)</span>\n<span class=\"token comment\">// ArrayBuffer(75677) {}</span></code></pre></div>\n<h2 id=\"vue-file-upload\" style=\"position:relative;\"><a href=\"#vue-file-upload\" aria-label=\"vue file upload permalink\" class=\"anchor-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Vue File Upload</h2>\n<p>Vue 를 파일업로드 기능은 File API 를 활용하여 미리보기 이미지를 표시해주고, 파일정보를 체크하여 벨리데이션 체크 하는것 까지 간단한 예제를 살펴볼 것이다.</p>\n<p><img src=\"/assets/vue-fileupload-sample.png\" alt=\"Vue File Upload\" title=\"Vue File Upload\"></p>\n<p><strong>install axios</strong></p>\n<div class=\"gatsby-highlight\" data-language=\"npm\"><pre class=\"language-npm\"><code class=\"language-npm\">npm install axios</code></pre></div>\n<p><strong>axios module</strong></p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token comment\">// src/http/index.js</span>\n<span class=\"token keyword\">import</span> axios <span class=\"token keyword\">from</span> <span class=\"token string\">\"axios\"</span>\n\n<span class=\"token keyword\">const</span> http <span class=\"token operator\">=</span> axios<span class=\"token punctuation\">.</span><span class=\"token function\">create</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n  <span class=\"token literal-property property\">baseURL</span><span class=\"token operator\">:</span> <span class=\"token string\">\"https://testrestapi.cafe24.com\"</span><span class=\"token punctuation\">,</span>\n  <span class=\"token literal-property property\">headers</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span> <span class=\"token string-property property\">\"content-type\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"application/json\"</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n\nhttp<span class=\"token punctuation\">.</span>defaults<span class=\"token punctuation\">.</span>headers<span class=\"token punctuation\">.</span>post<span class=\"token punctuation\">[</span><span class=\"token string\">\"Content-Type\"</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token string\">\"application/x-www-form-urlencoded\"</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> http</code></pre></div>\n<p><strong>View/FileUpload.vue</strong></p>\n<div class=\"gatsby-highlight\" data-language=\"html\"><pre class=\"language-html\"><code class=\"language-html\"><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>template</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token attr-name\">class</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>file-upload<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>form</span> <span class=\"token attr-name\">@submit.prevent</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>formSubmit<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">method</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>post<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>\n      <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>input</span> <span class=\"token attr-name\">type</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>file<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">ref</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>selectFile<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">@change</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>previewFile<span class=\"token punctuation\">\"</span></span> <span class=\"token punctuation\">/></span></span>\n      <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>ul</span> <span class=\"token attr-name\">v-if</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>selectFile<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>\n        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>li</span><span class=\"token punctuation\">></span></span>lastModified : {{ selectFile.lastModified }}<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>li</span><span class=\"token punctuation\">></span></span>\n        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>li</span><span class=\"token punctuation\">></span></span>lastModifiedDate : {{ selectFile.lastModifiedDate }}<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>li</span><span class=\"token punctuation\">></span></span>\n        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>li</span><span class=\"token punctuation\">></span></span>name : {{ selectFile.name }}<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>li</span><span class=\"token punctuation\">></span></span>\n        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>li</span><span class=\"token punctuation\">></span></span>size(byte) : {{ selectFile.size }}<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>li</span><span class=\"token punctuation\">></span></span>\n        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>li</span><span class=\"token punctuation\">></span></span>type : {{ selectFile.type }}<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>li</span><span class=\"token punctuation\">></span></span>\n        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>li</span><span class=\"token punctuation\">></span></span>webkitRelativePath : {{ selectFile.webkitRelativePath }}<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>li</span><span class=\"token punctuation\">></span></span>\n      <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>ul</span><span class=\"token punctuation\">></span></span>\n      <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>img</span> <span class=\"token attr-name\">v-if</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>previewImgUrl<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">:src</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>previewImgUrl<span class=\"token punctuation\">\"</span></span> <span class=\"token punctuation\">/></span></span>\n      <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>button</span> <span class=\"token attr-name\">type</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>submit<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">:disabled</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>isUploading<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>Upload<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>button</span><span class=\"token punctuation\">></span></span>\n\n      <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span><span class=\"token punctuation\">></span></span>\n        <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>hr</span> <span class=\"token punctuation\">/></span></span>\n        response : {{ response }}\n      <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>form</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>template</span><span class=\"token punctuation\">></span></span>\n\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>script</span><span class=\"token punctuation\">></span></span><span class=\"token script\"><span class=\"token language-javascript\">\n  <span class=\"token comment\">// axios module import</span>\n  <span class=\"token keyword\">import</span> http <span class=\"token keyword\">from</span> <span class=\"token string\">\"../http\"</span>\n\n  <span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token literal-property property\">name</span><span class=\"token operator\">:</span> <span class=\"token string\">\"FormValidation\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token literal-property property\">components</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n    <span class=\"token function\">data</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">return</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token literal-property property\">selectFile</span><span class=\"token operator\">:</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">,</span> <span class=\"token comment\">// 파일 객체</span>\n        <span class=\"token literal-property property\">previewImgUrl</span><span class=\"token operator\">:</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">,</span> <span class=\"token comment\">// 미리보기 이미지 URL</span>\n        <span class=\"token literal-property property\">isUploading</span><span class=\"token operator\">:</span> <span class=\"token boolean\">false</span><span class=\"token punctuation\">,</span> <span class=\"token comment\">// 파일 업로드 체크</span>\n        <span class=\"token literal-property property\">response</span><span class=\"token operator\">:</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">,</span> <span class=\"token comment\">// 파일 업로드후 응답값</span>\n      <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n    <span class=\"token literal-property property\">methods</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token function\">previewFile</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token comment\">// 선택된 파일이 있는가?</span>\n        <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token number\">0</span> <span class=\"token operator\">&lt;</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>$refs<span class=\"token punctuation\">.</span>selectFile<span class=\"token punctuation\">.</span>files<span class=\"token punctuation\">.</span>length<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n          <span class=\"token comment\">// 0 번째 파일을 가져 온다.</span>\n          <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>selectFile <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>$refs<span class=\"token punctuation\">.</span>selectFile<span class=\"token punctuation\">.</span>files<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span>\n          <span class=\"token comment\">// 마지막 . 위치를 찾고 + 1 하여 확장자 명을 가져온다.</span>\n          <span class=\"token keyword\">let</span> fileExt <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>selectFile<span class=\"token punctuation\">.</span>name<span class=\"token punctuation\">.</span><span class=\"token function\">substring</span><span class=\"token punctuation\">(</span>\n            <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>selectFile<span class=\"token punctuation\">.</span>name<span class=\"token punctuation\">.</span><span class=\"token function\">lastIndexOf</span><span class=\"token punctuation\">(</span><span class=\"token string\">\".\"</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">+</span> <span class=\"token number\">1</span>\n          <span class=\"token punctuation\">)</span>\n          <span class=\"token comment\">// 소문자로 변환</span>\n          fileExt <span class=\"token operator\">=</span> fileExt<span class=\"token punctuation\">.</span><span class=\"token function\">toLowerCase</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n          <span class=\"token comment\">// 이미지 확장자 체크, 1메가 바이트 이하 인지 체크</span>\n          <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>\n            <span class=\"token punctuation\">[</span><span class=\"token string\">\"jpeg\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"png\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"gif\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"bmp\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span><span class=\"token function\">includes</span><span class=\"token punctuation\">(</span>fileExt<span class=\"token punctuation\">)</span> <span class=\"token operator\">&amp;&amp;</span>\n            <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>selectFile<span class=\"token punctuation\">.</span>size <span class=\"token operator\">&lt;=</span> <span class=\"token number\">1048576</span>\n          <span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token comment\">// FileReader 를 활용하여 파일을 읽는다</span>\n            <span class=\"token keyword\">var</span> reader <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">FileReader</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n            reader<span class=\"token punctuation\">.</span><span class=\"token function-variable function\">onload</span> <span class=\"token operator\">=</span> <span class=\"token parameter\">e</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n              <span class=\"token comment\">// base64</span>\n              <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>previewImgUrl <span class=\"token operator\">=</span> e<span class=\"token punctuation\">.</span>target<span class=\"token punctuation\">.</span>result\n            <span class=\"token punctuation\">}</span>\n            reader<span class=\"token punctuation\">.</span><span class=\"token function\">readAsDataURL</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>selectFile<span class=\"token punctuation\">)</span>\n          <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>selectFile<span class=\"token punctuation\">.</span>size <span class=\"token operator\">&lt;=</span> <span class=\"token number\">1048576</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token comment\">// 이미지외 파일</span>\n            <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>previewImgUrl <span class=\"token operator\">=</span> <span class=\"token keyword\">null</span>\n          <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token function\">alert</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"파일을 다시 선택해 주세요.\"</span><span class=\"token punctuation\">)</span>\n            <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>selectFile <span class=\"token operator\">=</span> <span class=\"token keyword\">null</span>\n            <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>previewImgUrl <span class=\"token operator\">=</span> <span class=\"token keyword\">null</span>\n          <span class=\"token punctuation\">}</span>\n        <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n          <span class=\"token comment\">// 파일을 선택하지 않았을때</span>\n          <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>selectFile <span class=\"token operator\">=</span> <span class=\"token keyword\">null</span>\n          <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>previewImgUrl <span class=\"token operator\">=</span> <span class=\"token keyword\">null</span>\n        <span class=\"token punctuation\">}</span>\n        console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>selectFile<span class=\"token punctuation\">)</span>\n      <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n\n      <span class=\"token keyword\">async</span> <span class=\"token function\">formSubmit</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>selectFile<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n          <span class=\"token comment\">// Form 필드 생성</span>\n          <span class=\"token keyword\">let</span> form <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">FormData</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n          form<span class=\"token punctuation\">.</span><span class=\"token function\">append</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"file\"</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>selectFile<span class=\"token punctuation\">)</span> <span class=\"token comment\">// api file name</span>\n          <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>isUploading <span class=\"token operator\">=</span> <span class=\"token boolean\">true</span>\n\n          http\n            <span class=\"token punctuation\">.</span><span class=\"token function\">post</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"/api/sample/upload/\"</span><span class=\"token punctuation\">,</span> form<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span>\n              <span class=\"token literal-property property\">headers</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n                <span class=\"token string-property property\">\"Content-Type\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"multipart/form-data\"</span><span class=\"token punctuation\">,</span>\n              <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n            <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n            <span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">res</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n              <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>response <span class=\"token operator\">=</span> res\n              <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>isUploading <span class=\"token operator\">=</span> <span class=\"token boolean\">false</span>\n            <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n            <span class=\"token punctuation\">.</span><span class=\"token function\">catch</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">error</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n              <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>response <span class=\"token operator\">=</span> error\n              <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>isUploading <span class=\"token operator\">=</span> <span class=\"token boolean\">false</span>\n            <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n          <span class=\"token function\">alert</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"파일을 선택해 주세요.\"</span><span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">}</span>\n\n        <span class=\"token keyword\">return</span> <span class=\"token boolean\">true</span>\n      <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">}</span>\n</span></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>script</span><span class=\"token punctuation\">></span></span>\n\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>style</span> <span class=\"token attr-name\">scoped</span><span class=\"token punctuation\">></span></span><span class=\"token style\"></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>style</span><span class=\"token punctuation\">></span></span></code></pre></div>","tableOfContents":"<ul>\n<li><a href=\"/vue/vue-js-%ED%8C%8C%EC%9D%BC%EC%97%85%EB%A1%9C%EB%93%9C/#mime-type%EC%9D%B4%EB%9E%80\">MIME TYPE이란</a></li>\n<li>\n<p><a href=\"/vue/vue-js-%ED%8C%8C%EC%9D%BC%EC%97%85%EB%A1%9C%EB%93%9C/#mime-type%EC%9D%98-%EA%B5%AC%EC%84%B1\">MIME TYPE의 구성</a></p>\n<ul>\n<li><a href=\"/vue/vue-js-%ED%8C%8C%EC%9D%BC%EC%97%85%EB%A1%9C%EB%93%9C/#%EA%B0%9C%EB%B3%84-%ED%83%80%EC%9E%85\">개별 타입</a></li>\n<li><a href=\"/vue/vue-js-%ED%8C%8C%EC%9D%BC%EC%97%85%EB%A1%9C%EB%93%9C/#%EB%A9%80%ED%8B%B0%ED%8C%8C%ED%8A%B8-%ED%83%80%EC%9E%85\">멀티파트 타입</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"/vue/vue-js-%ED%8C%8C%EC%9D%BC%EC%97%85%EB%A1%9C%EB%93%9C/#file-api\">File API</a></p>\n<ul>\n<li><a href=\"/vue/vue-js-%ED%8C%8C%EC%9D%BC%EC%97%85%EB%A1%9C%EB%93%9C/#input-file-type\">input file type</a></li>\n<li>\n<p><a href=\"/vue/vue-js-%ED%8C%8C%EC%9D%BC%EC%97%85%EB%A1%9C%EB%93%9C/#input-%EC%9D%98-%EC%86%8D%EC%84%B1\">input 의 속성</a></p>\n<ul>\n<li><a href=\"/vue/vue-js-%ED%8C%8C%EC%9D%BC%EC%97%85%EB%A1%9C%EB%93%9C/#inputvalue\">input.value</a></li>\n<li><a href=\"/vue/vue-js-%ED%8C%8C%EC%9D%BC%EC%97%85%EB%A1%9C%EB%93%9C/#inputaccept\">input.accept</a></li>\n<li><a href=\"/vue/vue-js-%ED%8C%8C%EC%9D%BC%EC%97%85%EB%A1%9C%EB%93%9C/#inputcapture\">input.capture</a></li>\n</ul>\n</li>\n<li><a href=\"/vue/vue-js-%ED%8C%8C%EC%9D%BC%EC%97%85%EB%A1%9C%EB%93%9C/#filelist\">FileList</a></li>\n<li><a href=\"/vue/vue-js-%ED%8C%8C%EC%9D%BC%EC%97%85%EB%A1%9C%EB%93%9C/#file\">File</a></li>\n<li>\n<p><a href=\"/vue/vue-js-%ED%8C%8C%EC%9D%BC%EC%97%85%EB%A1%9C%EB%93%9C/#blob-binary-large-object\">Blob (Binary Large Object)</a></p>\n<ul>\n<li><a href=\"/vue/vue-js-%ED%8C%8C%EC%9D%BC%EC%97%85%EB%A1%9C%EB%93%9C/#blob-readablestream-%EC%99%80-arraybuffer\">Blob ReadableStream 와 ArrayBuffer</a></li>\n<li><a href=\"/vue/vue-js-%ED%8C%8C%EC%9D%BC%EC%97%85%EB%A1%9C%EB%93%9C/#blob-url\">Blob URL</a></li>\n<li><a href=\"/vue/vue-js-%ED%8C%8C%EC%9D%BC%EC%97%85%EB%A1%9C%EB%93%9C/#blob-canvas-%EC%99%80-createimagebitmap\">Blob Canvas 와 createImageBitmap</a></li>\n</ul>\n</li>\n<li><a href=\"/vue/vue-js-%ED%8C%8C%EC%9D%BC%EC%97%85%EB%A1%9C%EB%93%9C/#filereader\">FileReader</a></li>\n<li><a href=\"/vue/vue-js-%ED%8C%8C%EC%9D%BC%EC%97%85%EB%A1%9C%EB%93%9C/#network-%EC%99%80-file\">Network 와 File</a></li>\n</ul>\n</li>\n<li><a href=\"/vue/vue-js-%ED%8C%8C%EC%9D%BC%EC%97%85%EB%A1%9C%EB%93%9C/#vue-file-upload\">Vue File Upload</a></li>\n</ul>","wordCount":{"words":965},"fields":{"slug":"/vue/vue-js-파일업로드/","image":"/assets/vue-logo.png","faq":[]},"frontmatter":{"title":"Vue Js 뷰 파일업로드","date":"2021년 5월 2일","dateISO":"2021-05-02T15:11:34.709Z","updatedISO":null,"category":"vue","description":"라우트에 연결하거나 탐색을 수행 할 때 이름이 있는 라우트를 사용할수 있다. 사용 법은 routes 에 name 옵션을 지정 하면 된다. 라우트 관리가 편리 하다 라는 장점이 있다.","tags":["vue","javascript","framework","frontend","web","file","FormData","FileReader"]}}},"pageContext":{"slug":"/vue/vue-js-파일업로드/","previous":{"fields":{"slug":"/vue/vue-js-vee-validate/"},"frontmatter":{"title":"Vue Js Vee Validate","tags":["vue","javascript","framework","frontend","web","veevalidate","library"]}},"next":{"fields":{"slug":"/vue/vue-js-소프트웨어국제화-i18n/"},"frontmatter":{"title":"Vue Js 소프트웨어국제화(i18n)","tags":["vue","javascript","framework","frontend","web","file","FormData","FileReader"]}}}},"staticQueryHashes":["213619243","3262363727"]}