React 에서 파일 업로드하고 nodejs 멀터에서 메모리로 파일 받기
참고프로젝트
YoutubeCrawl_hook, Node_youtube_crawl file 폴더안에 있음
리엑트는 조잡해서 설명하기 싫다
노드에서는 multipart/form 으로 들어오는 파일은 body에 실려오지 않기 때문에
모듈을 써야하는데, 요즘은 aws, azure 같은 클라우드 서비스를 활용하거나
사진같은것도 원본을 기준으로 리사이징 작업이 많기 때문에
쌩 multer 모듈이나 쌩 multer-s3 모듈을 쓰면 맘대로 컨트롤 할수가 없게된다
util/upload.js
const util = require("util");
const multer = require("multer");
const maxSize = 2 * 1024 * 1024; // 2mb 라는 뜻이다
const { config } = require("../config/config");
const path = require("path");
//파일을 메모리로 받는 방법이다. filename 옵션은 에러는 안나는데 안먹는다
const storage = multer.memoryStorage({
filename: (req, file, cb) => {
console.log(file.originalname);
cb(null, file.originalname + new Date());
},
});
//하드디스크로 받는 방법이다
/*
let storage = multer.diskStorage({
destination: (req, file, cb) => {
cb(null, "public/file");
},
filename: (req, file, cb) => {
console.log(file.originalname);
cb(null, file.originalname + new Date());
},
});
*/
let uploadFile = multer({
storage: storage,
limits: { files: 3, fileSize: maxSize },
fileFilter: function (req, file, callback) {
var ext = path.extname(file.originalname);
if (
file.mimetype.split("/")[0] !== "image" ||
(ext !== ".png" && ext !== ".jpg" && ext !== ".gif" && ext !== ".jpeg")
) {
req.fileValidateError = `png, jpg, gif, jpeg 파일만 가능합니다`;
return callback(new Error("png, jpg, gif, jpeg 파일만 가능합니다"));
}
callback(null, true);
},
}).array("file");
//파일을 여러개 받고 싶으면 array 라고 써주면 된다.
/**
* single 모드일땐 req.file 에 파일이 담기고,
* array 일땐 req.files 에 배열로 담긴다
*/
//await을 걸수 있게 해주는 모드
let uploadFileMiddleware = util.promisify(uploadFile);
module.exports = uploadFileMiddleware;
이렇게 파일 업로드된 기능을 함수로 만들어서 빼주고
router/file/fileRouter.js
var express = require("express");
var router = express.Router();
const { config } = require("../../config/config");
const uploadFile = require("../../util/upload");
router.post("/upload", async (req, res, next) => {
try {
await uploadFile(req, res);
console.log("## entered : ", req.files);
if (!req.files) {
console.log("## Please upload a file!");
return res.status(200).send({ message: "Please upload a file!" });
}
console.log("## Uploaded the file successfully");
res.status(200).send({
message: "Uploaded the file successfully: ",
});
} catch (err) {
console.log("!!!", err);
res.status(200).send({
message: `Could not upload the file: ${err}`,
});
}
});
await uploadFile(req, res) 이걸 호출하면 파일이 req.files || req.file에 담기게 된다
댓글
댓글 쓰기