본문 바로가기

Node.js/node 활용하기

node multer을 활용한 파일 업로드

반응형

 

 

 

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <!-- 일반 파일 업로드 -->
    <form method="POST" enctype="multipart/form-data" action="./upload">
      <input type="file" name="userfile" />
      <input type="submit" value="전송하기" />
    </form>

    <!-- 일반 다중파일 업로드  -->
    <br />
    <br />
    <br />
    <hr />
    <form
      method="POST"
      enctype="multipart/form-data"
      action="./upload-multiple"
    >
      <input type="file" name="many" multiple />
      <input type="text" name="title" />
      <input type="submit" value="전송하기" />
    </form>
    <br />
    <br />
    <br />
    <hr />
    <!-- 파일을 여러개 업로드하지만 input태그나 폼데이터의 키가 다른경우 -->
    <form
      method="POST"
      enctype="multipart/form-data"
      action="./upload-multiple-fields"
    >
      <input type="file" name="file1" />
      <input type="file" name="file2" />
      <input type="text" name="title" />
      <input type="submit" value="전송하기" />
    </form>
    <br />
    <br />
    <br />
  </body>
</html>

 

single 옵션을 사용하면 단일 파일 받아오기

 

array로 받아오면 배열 형태로 (input type="file" multiple) 파일들을 받아오기

 

fields 를 활용하면 upload.fields([{name : 'file1'}, {name : 'file2'}]  형태로 직접 정의를하고 각각 name에 맞게 받아 올 수 있다.

 

 

index.js 

const express = require("express");
const multer = require("multer");
const fs = require("fs");
const path = require("path");
const app = express();

app.set("view engine", "ejs");
app.use(express.urlencoded({ extended: false }));
app.use(express.json());
app.use(express.static(`${__dirname}/public`));

app.get("/", (req, res, next) => {
  console.log(__dirname);

  return res.render("index");
});

// const upload = multer({dest:'uploads/'});
const upload = multer({
  storage: multer.diskStorage({
    // set a localstorage destination
    //   어떤이름으로 저장할지가 들어있다.

    //위치 지정
    destination: (req, file, done) => {
      done(null, "uploads/");
    },
    //지정
    // convert a file name
    filename: (req, file, done) => {
      const ext = path.extname(file.originalname);
      done(null, path.basename(file.originalname, ext) + Date.now() + ext);
      // cb(null, new Date().valueOf() + path.extname(file.originalname));
    },
  }),
  limits: { fileSize: 5 * 1024 * 1024 },
});

app.post("/upload", upload.single("userfile"), (req, res) => {
  // return res.render("di")
  console.log(req.file);
});

app.post("/upload-multiple", upload.array("many"), (req, res) => {
  // return res.render("di")
  console.log(req.files);
});


app.post(
  "/upload-multiple-fields",
  upload.fields([{ name: "file1" }, { name: "file2" }]),
  (req, res) => {
    // return res.render("di")
    console.log(req.files);
  }
);

app.listen(8000, () => console.log("8000포트 대기중"));

반응형