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: (reqfilecb=> {
    console.log(file.originalname);
    cb(nullfile.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: 3fileSize: maxSize },

  fileFilter: function (reqfilecallback) {
    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(nulltrue);
  },
}).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 (reqresnext=> {
  try {
    await uploadFile(reqres);
    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(reqres) 이걸 호출하면 파일이 req.files || req.file에 담기게 된다 

 

댓글

이 블로그의 인기 게시물

[ref game]

[AI Image]