๋ณธ๋ฌธ์œผ๋กœ ๋ฐ”๋กœ๊ฐ€๊ธฐ

 

  1. mongoDB์— file ์›๋ณธ์„ ์ €์žฅํ•˜์ง€ ์•Š๊ณ , file์˜ location์„ ์ €์žฅํ•  ๊ฒƒ์ด๋‹ค.
  2. Multer๋ผ๋Š” middleware๋ฅผ ํ†ตํ•ด ์ค‘๊ฐ„์— uploadํ•˜๋ ค๋Š” ํŒŒ์ผ์˜ ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.
  3. Multer์„ ํ†ตํ•ด ๋ฐ˜ํ™˜๋ฐ›์€ file์˜ URL์„ mongoDB์— ์ €์žฅํ•œ๋‹ค.

 

multer

  • multer๋Š” ํŒŒ์ผ ์ €์žฅ์„ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” node.js middleware์ž…๋‹ˆ๋‹ค.
  • multer๋ฅผ ์ด์šฉํ•ด์„œ ํŒŒ์ผ์„ ์ €์žฅํ•˜๋ฉด ํŒŒ์ผ๋ช…์ด ์ž„์˜๋กœ ๋ฐ”๋€Œ๊ณ  ๋ฌธ์„œํ˜•ํƒœ๋กœ ๋ณ€ํ™˜๋˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
npm install multer

 

 

upload.pug

form(action=`/videos${routes.upload}`, method="post", enctype="multipart/form-data")
		label(for="file") Video File
		input(type="file", id="file", name="videoFile", required=true, accept="video/*")
		input(type="text", name="title", required = true)
		textarea(name="description", placeholder="Description", required=true)
		input(type="submit", value="Upload now")
  • video file๋งŒ Uploadํ•˜๊ฒŒ ํŒŒ์ผ ํ™•์žฅ์ž์— ๋Œ€ํ•œ ์ œํ•œ์„ ๊ฑด๋‹ค. input์˜ accept property๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
  • <input type="file" accept="ํŒŒ์ผ ํ™•์žฅ์ž|audio/*|video/*|image/*|๋ฏธ๋””์–ด ํƒ€์ž…">์™€ ๊ฐ™์€ ํ˜•์‹์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
    ์šฐ๋ฆฌ๋Š” video๋ฅผ ์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์— <input type="file" accept="video/*">๋ผ๊ณ  ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
  • multer๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„  form์˜ ์†์„ฑ์ธ enctype(์ธ์ฝ”๋”ฉ ํƒ€์ž…)์ด multipart/form-data ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. enctype์ด ์ง€์ •๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฉด ์ €์žฅํ•  ์ˆ˜ ์—†์œผ๋‹ˆ ์œ ์˜ํ•ฉ๋‹ˆ๋‹ค. <form enctype="multipart/form-data">

 

middlewares.js

 

import multer from "multer";

const multerVideo = multer({dest:"videos/"});
// 'videos/'๋กœ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ง€์ •ํ•œ๋‹ค. videos/๋ผ๋Š” ๋œป์€ ํ˜„์žฌ ํด๋” ๋ฐ‘์— videos์ด๋‹ค.
// '/videos/'๋กœ ํ•˜๋ฉด ์ปดํ“จํ„ฐ ๋ฃจํŠธํด๋”๋กœ๋ถ€ํ„ฐ์˜ ํด๋”๊ฒฝ๋กœ๋ฅผ ์˜๋ฏธํ•˜๊ฒŒ ๋˜๋ฏ€๋กœ ์ฃผ์˜
// ํด๋”๋Š” multer๊ฐ€ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•˜๋ฏ€๋กœ ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š์•„๋„ ๋œ๋‹ค.

export const uploadVideo = multerVideo.single("videoFile")

 

 

์–ด๋–ค ์ด๋ฆ„์˜(form์—์„œ name ์†์„ฑ) ํŒŒ์ผ์„ ๋ช‡๊ฐœ ์—…๋กœ๋“œ ํ• ์ง€๋„ ์ •ํ•ด์•ผํ•œ๋‹ค.

  • ์ด๋ฆ„์€ form๋‚ด๋ถ€ file type input์˜ name๊ณผ ๋™์ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • single์˜ ์˜๋ฏธ๋Š” ํ•˜๋‚˜์˜ ํŒŒ์ผ์„ ์—…๋กœ๋“œํ•œ๋‹ค๋Š” ๋œป์ด๋‹ค.

 

videoRouter.js

import {uploadVideoMiddleware} from '../middlewares';

videoRouter.post(routes.upload, uploadVideoMiddleware, postUpload);

post method๋กœ /upload๋กœ ์š”์ฒญํ•˜๋ฉด ์‘๋‹ต์œผ๋กœ postUpload๊ฐ€ ์‹คํ–‰๋˜๋Š”๋ฐ์š”. postUpload๊ฐ€ ์‹คํ–‰๋˜๊ธฐ์ „์— ํŒŒ์ผ์„ ์—…๋กœ๋“œํ•˜๊ธฐ์œ„ํ•ด uploadVideoMiddleware๋ฅผ ์‚ฌ์ด์— ๋„ฃ์–ด์ค๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์ด middleware๊ฐ€ ์ €์žฅํ•œ ํŒŒ์ผ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ req.file์— ๋„ฃ์€ ํ›„ postUpload๋ฅผ ์‹คํ–‰์‹œํ‚ต๋‹ˆ๋‹ค. ์ฐธ๊ณ ๋กœ middleware๋ผ๋ฆฌ๋Š” res,req๋ฅผ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค.

 

 

videoController

postUpload ํ•จ์ˆ˜์— ๋Œ€ํ•œ ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. multer๋Š” ์ €์žฅํ•œ ํŒŒ์ผ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ req์˜ file์— ๋‹ด์•„์„œ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ์•„๋ž˜์˜ ์ฝ”๋“œ๋กœ ์šฐ๋ฆฌ๋Š” file์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

export const postUpload = (req, res) => {
	const {file} = req; 
    console.log(file);
}

 

upload ํŽ˜์ด์ง€์—์„œ ์—…๋กœ๋“œ๋ฅผ ํ•˜๊ณ  ์ฝ˜์†”์„ ํ™•์ธํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.


์—…๋กœ๋“œํ•œ file์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋„ค์š”. ์ด ์ค‘์—์„œ ๋ˆˆ์—ฌ๊ฒจ๋ณผ ๊ฒƒ์€ ๋ฐ”๋กœ path ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ Video Model์„ ๋งŒ๋“ค๋•Œ ์šฐ๋ฆฌ๋Š” database์— file ์ž์ฒด๋ฅผ ์ €์žฅํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ fileURL์„ ์ €์žฅํ•  ๊ฒƒ์ด๋ผ๊ณ  ํ•˜์˜€์ฃ . ์ด fileURL์— ํ•ด๋‹นํ•˜๋Š” ๊ฒƒ์ด ๋ฐ”๋กœ path์ž…๋‹ˆ๋‹ค. ์ด์ œ ์ด ์ •๋ณด๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— Video element๋ฅผ ์ถ”๊ฐ€ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

 

  • Video.create({})
    Video model์˜ ๋ฉ”์†Œ๋“œ create์— ์˜ํ•˜์—ฌ element ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌํ•˜์—ฌ ์‹คํ–‰ํ•˜๋ฉด ํ•ด๋‹น element๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅํ•˜๊ณ  ์ €์žฅ๋œ video ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•ด์ค๋‹ˆ๋‹ค.
  • newVideo.id
    redirectํ•˜๋Š” ๋ถ€๋ถ„์„ ๋ณด๋ฉด Video model schema๋กœ id๋ฅผ ์ ์–ด์ค€์ ์€ ์—†์ง€๋งŒ mongoDB ์ž์ฒด์ ์œผ๋กœ id๋ฅผ ๋ถ€์—ฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— id ์†์„ฑ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค._id๋กœ ํ•˜์—ฌ๋„ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

 

 

import Video from '../models/Video';

export const postUpload = async(req, res) => {
	const {
    	body : { title, description },
    	file : { path }
        	= req; 
            
    const newVideo = await Video.create({
    	fileUrl : path,
        title,
        description }); 
        
	res.redirect(routes.videoDetail(newVideo.id));
}

 

 

 

 

 

๋ฐ˜์‘ํ˜•