-
[포스코x코딩온] 파일업로드(multer, Axios 동적 파일 업로드)[포스코x코딩온] 웹개발자 풀스택 부트캠프8기 2023. 8. 2. 23:39728x90
body-parser
- 데이터를 쉽게 처리할 수 있도록 도와주는 라이브러리
- Post로 정보를 전송할 때 요청의 body(req.body)로 받을 수 있게 도와줌
- express 4.x부터 body-parser가 내장되어 있어 설치 필요 없음
- 단점
- 멀티파트 데이터(이미지, 동영상, 파일 등)를 처리하지 못한다.
- multer를 이용하자!
파일 업로드(multer)
- 클라이언트 -> 서버 데이터 전송하는 법
<input type = "file" name="userfile">
multer 미들웨어
- 파일 업로드를 위해 사용되는 미들웨어
- express로 서버를 구축할 때 가장 많이 사용되는 미들웨어
- 설치하기
npm install multer
- multer 불러오기
const multer = require("multer");
- 클라이언트 준비
- form 태그의 enctype 속성으로 'multipart/form-data' 반드시 설정
- post 방식으로 해야 한다.
<!--method="post" enctype="multipart/form-data" 이 부분은 필수--> <form action="/upload" method="post" enctype="multipart/form-data">
- 파일 업로드 경로 설정
- dest: 파일을 업로드하고 그 파일이 저장될 경로를 지정하는 속성
//multer Setting const upload = multer({ //dest: 업로드한 파일을 저장할 경로 지정 dest: "uploads/", //폴더가 자동으로 생성된다. });
하나의 파일 업로드
- single()
app.post("/upload", uploadDetail.single("userfile"), (req, res) => { console.log(req.file); console.log(req.body); });
- req.file객체와 req.body 객체로 파일 정보 확인 가능
파일 정보를 확인할 수 있다.
세부 정보 설정
- 경로뿐 아니라 파일명, 파일 크기 등을 직접 지정, 제어 할 수 있다.
- multer setting을 통해 파일 정보를 수정하여 업로드할 수 있고, req.file을 통해 정보를 확인할 수 있다.
- 보통 파일 이름의 중복을 방지하기 위하여 => 보통, originalname에 접근하여 파일명 뒤에 timestamp로 파일명 중복을 방지한다.
const uploadDetail = multer({ //storage: 저장할 공간에 대한 정보 //diskstorage: 파일을 디스크에 저장하기 위한 모든 제어 기능 제공 storage: multer.diskStorage({ //destination : 파일 저장 경로 지정 destination(req, file, done) { done(null, "uploads/"); //폴더가 자동생성이 안되서 미리 폴더를 만들어 두어야 한다. }, //filename: 파일 이름 설정 filename(req, file, done) { const ext = path.extname(file.originalname); //파일 경로에 확장자가를 가져옴 done(null, path.basename(file.originalname, ext) + Date.now() + ext); //ext(확장자), basename(원래 이름 originalname, 에서 ext를 떼라) }, }), limits: { fileSize: 1024 * 1024 * 5 }, //5메가로 용량 지정 });
파일 여러 개 업로드(ver1)
- array() : 여러 파일을 업로드할 때 사용, 하나의 요청 안에 여러 파일이 존재할 때 사용
- files로 해야 한다.
- multipe 조건을 꼭 넣어야 한다.
<form action="/upload/array" method="post" enctype="multipart/form-data"> <input type="file" name="userfiles" multiple /><br /> <input type="text" name="title" /><br /> <button type="submit">파일 여러개 업로드</button> </form>
app.post("/upload/array", uploadDetail.array("userfiles"), (req, res) => { console.log(req.files); console.log(req.body); });
하나의 input 태그에 여러 개의 파일을 넣을 수 있다. 추가한 파일의 정보와 파일이 uploads 폴더에 들어간 것을 확인할 수 있다. 파일 여러 개 업로드(ver2)
- fields(): 여러 파일을 업로드할 때 사용, 하나의 요청이 아닌 여러 개의 요청이 들어올 때
<form action="/upload/fields" method="post" enctype="multipart/form-data"> <input type="file" name="userfile1" /><br /> <input type="text" name="title1" /><br /> <input type="file" name="userfile2" /><br /> <input type="text" name="title2" /><br /> <button type="submit">파일들 업로드</button> </form>
app.post( "/upload/fields", uploadDetail.fields([{ name: "userfile1" }, { name: "userfile2" }]), (req, res) => { console.log(req.files); console.log(req.body); } );
여러개의 input 태그를 사용하여 파일을 업로드 할 수 있다.
※정리
- single(): 하나의 파일 업로드
- req.file: 파일 하나
- req.body: 나머지 정보
- array(): 여러 파일을 업로드할 때 사용, 하나의 요청 안에 여러 개의 파일이 존재할 때
- req.files: 파일 n개
- req.body: 나머지 정보
- fields(): 여러 파일을 업로드할 때 사용, 하나의 요청이 아닌 여러 개의 요청이 들어올 때
- req.files: 파일 n개
- req.body: 나머지 정보
Axios 동적 파일 업로드
- 파일을 저장하고 불러와서 화면에 띄울 수 있다.
<h1>동적 파일 업로드</h1> <!--동적일 때는 form 태그가 필요 없다.--> <input type="file" name="dynamic-userfile" id="dynamic-userfile" /><br /> <button type="button" onclick="fileUpload()">업로드</button> <br /> <div class="result"></div> <script> let resultBox = document.querySelector(".result"); function fileUpload() { const file = document.getElementById("dynamic-userfile"); console.log(file.files[0]); const formData = new FormData(); formData.append("dynamic-userfile", file.files[0]); //폼 데이터 넣기 axios({ method: "POST", url: "/dynamicFile", data: formData, headers: { "content-type": "multipart/form-data", //enctype="multipart/form-data" }, }).then((res) => { console.log("res", res); resultBox.innerHTML = `<div><img src=${res.data.path}></div>`; }); } </script>
연습문제는 다음글에 동적 form 전송이랑 함께 게시하겠습니다.
https://dongho-kang.tistory.com/39
[포스코x코딩온] 동적form전송, 파일 업로드 실습
동적 form 전송 실습1. axios get 회원가입 회원가입을 axios의 get 메소드를 이용하여 받기. 작업 순서 practice_index.js을 통해 서버를 설정하고 데이터를 송수신하게 한다. practice_index.ejs를 통해 사용자
dongho-kang.tistory.com
728x90'[포스코x코딩온] 웹개발자 풀스택 부트캠프8기' 카테고리의 다른 글
[포스코x코딩온] 데이터베이스(DBMS 기본, MySQL 설치) (0) 2023.08.03 [포스코x코딩온] 동적form전송, 파일 업로드 실습 (0) 2023.08.03 [포스코x코딩온] 동적 form 전송(비동기 http 통신, ajex, axios, fetch, JSON) (0) 2023.08.02 [포스코x코딩온] Form 전송(body-parser, get, post, form validation, nodemon) (0) 2023.08.01 [포스코x코딩온] Javascript 고급(구조분해할당, ...연산자, 클래스) (0) 2023.07.31