이미지 & 텍스트 업로드 완성
먼저 upload시에 이미지로 인해 전송되는 data의 형식이 multipart/formData로 변경되었기 때문에
이전에 구현한 게시글 업로드를 수정해주어야 합니다.
PostForm.js에 가서 submit함수를 수정해볼까요
const onSubmit = () => {
//게시글 없으면 경고
if (!text || !text.trim()) {
return alert("게시글을 작성하세요");
}
const formData = new FormData();
imagePath.forEach((q) => {
formData.append("image", q); //키가 image 백에서 req.body.image
});
formData.append("content", text); //키가 content 백에서 req.body.content
//이미지가 없으면 formData를 쓸 필요가 없지만, multer nono을 써보기 위해
dispatch({ type: ADD_POST_REQUEST, data: formData });
};
//data:{image:~~~~, content:~~~~~};
이런식이라고 봐도 무방합니다.
백앤드 라우터에서는 아까 만든 upload에 none()이라는 매소드를 사용할 것입니다.
전에 작성한 이미지 업로드용 라우터는 남겨두고 게시글 작성 라우터를 수정하는 것입니다!
//게시글 등록 POST /post
router.post("/", isLoggedIn, upload.none(), async (req, res, next) => {
try {
const post = await Post.create({
content: req.body.content,
UserId: req.user.id,
});
//image는 front에서append로 정해준 키
if (req.body.image) {
if (Array.isArray(req.body.image)) {
//이미지를 여러개 올리면 image:[1.png,2.png]
const images = await Promise.all(
//한번에 모두 완료되면 올려준다.
req.body.image.map((image) => Image.create({ src: image })) //Image 모델에 넣어준다.
);
await post.addImages(images); //Sequelize매소드로 images를 넣어준다.
} else {
//이미지를 하나만 올리면 image:1.png
const image = await Image.create({ src: req.body.image });
await post.addImages(image);
}
}
//DB에는 IMAGE를 올리지 않고 서버에 가지고 있다가 DB에는 경로만 저장하는게 좋음 (DB는 캐싱 불가)
//Image 추가해주기
const fullPost = await Post.findOne({
where: { id: post.id },
include: [
{ model: Image },
{ model: Comment },
{ model: User, attributes: ["id", "nickname"] }, //작성자
{ model: User, as: "Likers", attributes: ["id"] }, //좋아요 누른사람
],
});
res.status(201).json(fullPost); //생성되었다고 프론트로
} catch (e) {
console.error(e);
next(e);
}
});
사람들이 가끔 DB에 이미지를 올리지 왜 서버에 올릴까? 라고 생각하는 사람들도 있는데,
이는 DB에 이미지를 업로드 하게되면 DB처리속도가 매우 느려지게 되며,
이미지와 같은 파일들은 캐싱이 가능한데 , DB에 업로드하게 된다면 캐싱이 불가능해집니다.
그런 이유로 DB에는 경로만 적어주고 , 경로를 보내주는 것입니다.
Last updated
Was this helpful?