doctype html
html(lang="ko")
form(method="POST", enctype="multipart/form-data")
label(for="avatar") Avatar
input(type="file", id="avatar", name="avatar", accept="image/*")
input(type="submit", value="Update Profile")
app.use("/images", express.static("images"));
imgUpload.single("avatar")
import express from "express";
import multer from "multer";
const app = express();
const imgUpload = multer({
dest: "images", // 파일이 저장 될 폴더.
limits: {
fileSize: 10000000,
},
});
// template engine으로 pug를 사용할 것을 명시함.
app.set("view engine", "pug");
app.set("views", process.cwd() + "/src/views");
// images 폴더가 정적 폴더임을 명시해준다.
app.use("/images", express.static("images"));
app.route("/").get(
(_, res)=>{
return res.render("home")
}
).post(imgUpload.single("avatar"),
(req, res) => {
console.log(req.file);
/*
출력값.
html form에서 전송한 데이터가 Multer middleware를 거치면서 아래와 같이 변형 되었다.
{
fieldname: 'avatar',
originalname: 'ë¹\x84ë\x94\x94ì\x98¤ í\x99\x94ë©´.PNG',
encoding: '7bit',
mimetype: 'image/png',
destination: 'images',
filename: '4bdad1ed9d3170884b39128dd293f654',
path: 'images\\4bdad1ed9d3170884b39128dd293f654',
size: 1232665
}
*/
return res.redirect("/");
}
);
const handleListening = () =>
console.log(`✅ Server listenting on http://localhost:5000 🚀`);
app.listen(5000, handleListening);
doctype html
html(lang="ko")
body
input.input__file(type="file", accept="image/*")
script(src="/public/js/home.js")
HTML에서 form element를 사용하는 대신 JavaScript에서 FormData 객체를 만들어 server에 데이터를 전송.
폼을 전송할 때 HTTP 메시지의 Content-Type 속성은 항상 multipart/form-data이고 메시지는 인코딩되어 전송됩니다.
const input = document.querySelector(".input__file")
async function handleSubmit(event){
const file = event.srcElement.files[0]
const formData = new FormData();
formData.append("avatar", file)
await fetch("/", {
method: "POST",
body: formData,
}).catch(console.error);
}
input.addEventListener("change", handleSubmit)
imgUpload.single("avatar")
코드는 위의 form element를 통한 전송에서의 server부분과 같습니다.
http://www.tcpschool.com/html-tag-attrs/form-enctype
https://ko.javascript.info/formdata