ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

ํŒŒ์ผ์„ ์—…๋กœ๋“œ ํ•˜๋Š” ์ž‘์—…์€ ๋งค์šฐ ๊ธฐ๋ณธ์  ์ด๋ฉด์„œ๋„ ์ค‘์š”ํ•œ ๊ธฐ๋Šฅ์ด๋‹ค. ์ด๋ฒˆ ์ฑ•ํ„ฐ์—์„œ๋Š” ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ์—…๋กœ๋“œ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ ํ•ด๋ณผ ๊ฒƒ์ด๋‹ค.

์ผ๋‹จ ์‹œ์ž‘ํ•˜๊ธฐ์— ์•ž์„œ์„œ multer ๋ชจ๋“ˆ์„ installํ•ด์ค€๋‹ค.


$ npm install --save multer






์ผ๋‹จ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ด๋Ÿฌํ•œ form์„ ๋งŒ๋“ค์–ด์„œ ์‹ค์Šต์„ ํ•ด๋ณด๊ฒ ๋‹ค. 


upload.pug

1
2
3
4
5
6
7
8
9
doctype html
html
    head
        meta(charset='utf-8')
    body
        form(action='upload' method='post' enctype="multipart/form-data")
            input(type='file' name='userfile')
            input(type='submit')
 
cs


๋‹ค๋ฅธ๊ฑด ๋‘˜์งธ์น˜๊ณ  form ํƒœ๊ทธ๋ฅผ ๋ณด๋ฉด form ํƒœ๊ทธ์˜ post ๋ฉ”์†Œ๋“œ ์‹คํ–‰ ์‹œ์— upload ๋ผ๋Š” ๋ผ์šฐํ„ฐ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•˜๊ฒ ๋‹ค๋Š” ๋œป์ธ๋ฐ ํŒŒ์ผ ์ „์†ก ์‹œ enctype ๋ถ€๋ถ„์„ ๊ผญ ์ž‘์„ฑํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค๊ณ  ํ•œ๋‹ค. ๊ทธ๋ƒฅ ์•Œ์•„๋‘ฌ์•ผ๊ฒ ๋‹ค.


์ด์ œ ํŒŒ์ผ์„ ์ „์†กํ•  ๋ผ์šฐํ„ฐ์™€ post๋œ ์ •๋ณด๋ฅผ ์ถœ๋ ฅํ•ด๋ณด๋Š” ์ฝ”๋“œ๋ฅผ node์—์„œ ์ž‘์„ฑํ•ด๋ณด๊ฒ ๋‹ค.



multer ๊ณต์‹ ์‚ฌ์ดํŠธ์— ๊ฐ€๋ฉด ๋‚˜์™€์žˆ๋Š” ๊ธฐ๋ณธ ํผ์ด ์žˆ๋‹ค.

var express = require('express')
var multer  = require('multer')
var upload = multer({ dest: 'uploads/' })
 
var app = express()
 
app.post('/profile', upload.single('avatar'), function (req, res, next) {
  // req.file is the `avatar` file
  // req.body will hold the text fields, if there were any
})
 
app.post('/photos/upload', upload.array('photos', 12), function (req, res, next) {
  // req.files is array of `photos` files
  // req.body will contain the text fields, if there were any
})
 
var cpUpload = upload.fields([{ name: 'avatar', maxCount: 1 }, { name: 'gallery', maxCount: 8 }])
app.post('/cool-profile', cpUpload, function (req, res, next) {
  // req.files is an object (String -> Array) where fieldname is the key, and the value is array of files
  //
  // e.g.
  //  req.files['avatar'][0] -> File
  //  req.files['gallery'] -> Array
  //
  // req.body will contain the text fields, if there were any
})

multer ๋ณ€์ˆ˜์— ๋ชจ๋“ˆ์„ requireํ•ด์„œ ๊ฐ์ฒด๋ฅผ ๋ฆฌํ„ด๋ฐ›๊ณ  ํ•ด๋‹น ๋ณ€์ˆ˜๋กœ ํŒŒ์ผ ์—…๋กœ๋“œ์— ๊ด€ํ•œ ์ž‘์—…์„ ํ•œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  multer์˜ ๊ธฐ๋ณธ ์„ค์ •์„ ํ•˜๋Š” ์ฝ”๋“œ๋กœ 

var upload = multer({ dest: 'uploads/' })

๋ฅผ ์ž‘์„ฑํ•˜์—ฌ ํŒŒ์ผ์ด ์ €์žฅ๋˜๋Š” ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ uploads๋ผ๋Š” ๋””๋ ‰ํ† ๋ฆฌ๋กœ ํ•˜๊ฒ ๋‹ค๊ณ  ์„ ์–ธํ•ด์ค€๋‹ค.(uploads ๋ผ๋Š” ํด๋”๋ฅผ ์ƒ์„ฑํ•ด์ค˜์•ผ ํ•œ๋‹ค.)


app.post('/profile', upload.single('avatar'), function (req, res, next) {
  // req.file is the `avatar` file
  // req.body will hold the text fields, if there were any
})

๋ณดํ†ต ์šฐ๋ฆฌ๊ฐ€ app.post ๋ถ€๋ถ„์„ ์ž‘์„ฑํ•  ๋•Œ ๋ผ์šฐํ„ฐ ์ฃผ์†Œ์™€ function ์ด ๋‘๊ฐœ๋กœ ์ž‘์„ฑ๋˜๋Š” ๊ฒƒ์ด ๋Œ€๋ถ€๋ถ„์ด์—ˆ๋Š”๋ฐ ๋ณด๋ฉด ์ค‘๊ฐ„์— ๋งค๊ฐœ๋ณ€์ˆ˜ ํ•˜๋‚˜๊ฐ€ ๋” ํฌํ•จ๋˜์–ด์žˆ๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. post ๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•ด ํ•ด๋‹น ๋ผ์šฐํ„ฐ์— ๋“ค์–ด์˜ค๊ฒŒ ๋˜๋ฉด function์ด ์‹คํ–‰๋˜๊ธฐ ์ „์— ๋‘ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ์ž‘์—…์ด ๋จผ์ € ์‹คํ–‰๋˜๊ฒŒ ๋œ๋‹ค. 


upload.single('avatar')์—์„œ avatar ๋ผ๊ณ ํ•˜๋Š” ๊ฒƒ์€ ํผ ์ž‘์„ฑ ์‹œ์— file์˜ name ๊ฐ’์ด๋‹ค. ๋‚˜๋Š” userfile ์ด๋ผ๊ณ  name๊ฐ’์„ ์ž‘์„ฑํ•˜์˜€์œผ๋ฏ€๋กœ userfile์„ ์จ์ฃผ๋ฉด ๋œ๋‹ค.


์ด๊ฒŒ ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ์‚ฌ์šฉ๋ฒ•์ธ๋ฐ ์กฐ๊ธˆ ๋” ์‹ฌํ™”๋œ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค. ๋‚ด๊ฐ€ ๋ดค์„ ๋•Œ๋Š” ๊ทธ๊ฒŒ ๋” ํšจ์œจ์ ์ธ ๊ฒƒ ๊ฐ™์•„์„œ ๋‚ด ์ฝ”๋“œ๋Š” ๊ทธ ๋ฐฉ๋ฒ•์œผ๋กœ ์ž‘์„ฑํ•ด๋ณด์•˜๋‹ค.


app.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
var express = require('express');
var app = express();
var multer = require('multer');
var _storage = multer.diskStorage({
    destination: function(req,file,cb) {
        cb(null,'uploads/')
    },
    filename: function(req,file,cb) {
        cb(null,file.originalname)
    }
})
var upload = multer({storage: _storage}) //๋ฏธ๋“ค์›จ์–ด ๋ฆฌํ„ด. ์‚ฌ์šฉ์ž๊ฐ€ ์—…๋กœ๋“œํ•œ ํŒŒ์ผ์„ ์–ด๋””์— ์ €์žฅํ•  ๊ฒƒ์ธ์ง€ ์„ค์ •
app.set('view engine','pug');
app.set('views','./views');
app.use(express.static('public'));
app.use('/user',express.static('uploads'));
app.get('/upload',function(req,res){
    res.render('upload');
});
app.post('/upload',upload.single('userfile'),function(req,res){
    res.send('uploaded :'+req.file.originalname);
    console.log(req.file);    
})
app.listen(3000function() {
    console.log('Connected 3000 port!');
});
 
cs


storage ๋ผ๋Š” ๋ถ€๋ถ„์ธ๋ฐ callback ํ•จ์ˆ˜์˜ ํ˜•์‹์œผ๋กœ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์„ค์ •๋“ค์„ ํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค.


var multer = require('multer');
var _storage = multer.diskStorage({
    destination: function(req,file,cb) {
        cb(null,'uploads/')
    },
    filename: function(req,file,cb) {
        cb(null,file.originalname)
    }
})
var upload = multer({storage: _storage})


์•„๊นŒ๋Š” upload ๋ณ€์ˆ˜์— ๋ฐ”๋กœ upload ํ•  ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๋ฐ”๋กœ ๊ฒฐ์ •ํ•ด ์ฃผ์—ˆ๋‹ค๋ฉด ์ด๋ฒˆ์—” ๋ณ€์ˆ˜ ๊ฐ’์œผ๋กœ ์ง€์ •ํ•ด์ฃผ๊ณ  ์žˆ๋‹ค.

ํ•ด๋‹น ๋ณ€์ˆ˜ ๊ฐ’์€ ๋””๋ ‰ํ† ๋ฆฌ, ํŒŒ์ผ์ด๋ฆ„ ๋“ฑ ์—ฌ๋Ÿฌ๊ฐ€์ง€๋ฅผ ์›ํ•˜๋Š” ์กฐ๊ฑด์œผ๋กœ ์ž‘์„ฑ๋˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค.


์—…๋กœ๋“œ๋  ํŒŒ์ผ์˜ ๊ฒฝ๋กœ๋ฅผ ์ •ํ•  ๋•Œ๋Š” destination ์ด๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด์„œ ์ •ํ•ด์ง€๊ฒŒ ๋˜๋Š”๋ฐ uploads๋ผ๋Š” ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ํ–ฅํ•˜๋„๋ก ํ•œ๋‹ค.


ํŒŒ์ผ ์ด๋ฆ„์€ filename ์˜ต์…˜ ์ค‘์— ํ•˜๋‚˜์ธ originalname (์‚ฌ์šฉ์ž๊ฐ€ ์—…๋กœ๋“œํ•œ ํŒŒ์ผ๋ช…์„ ๊ทธ๋Œ€๋กœ ๋”ฐ๋ผ๊ฐ) ์„ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ์ผ๋ช…์„ ์ €์žฅํ•˜๋„๋ก ํ•œ๋‹ค.


์ด ๋ฐฉ๋ฒ•์„ ๋” ์„ ํ˜ธํ•˜๋Š” ์ด์œ ๋Š” ํŒŒ์ผ์„ ์„œ๋ฒ„๋กœ ์—…๋กœ๋“œ ํ•  ๋•Œ text ํŒŒ์ผ์€ text ํŒŒ์ผ๋Œ€๋กœ, image ํŒŒ์ผ์€ image ํŒŒ์ผ๋Œ€๋กœ ๊ฐ๊ฐ์˜ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ง€์ •ํ•˜์—ฌ ์—…๋กœ๋“œ ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์˜ˆ๋ฅผ๋“ค๋ฉด


destination: function(req,file,cb) {
   if(์‚ฌ์šฉ์ž๊ฐ€ ์—…๋กœ๋“œ ํ•œ ํŒŒ์ผ์ด text ํ˜•์‹์ด๋ผ๋ฉด)     
cb(null,'text/')
else if(์‚ฌ์šฉ์ž๊ฐ€ ์—…๋กœ๋“œ ํ•œ ํŒŒ์ผ์ด image ํ˜•์‹์ด๋ผ๋ฉด)
cb(null,'image/')
    },


์™€ ๊ฐ™์ด ์‚ฌ์šฉ๋  ์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋” ๋งŽ์€ ๊ธฐ๋Šฅ์ด ์žˆ๊ฒ ์ง€๋งŒ ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ๊ธฐ๋Šฅ๋งŒ ์šฐ์„ ์ ์œผ๋กœ ๋ฐฐ์›Œ๋ดค๋‹ค.

ํŒŒ์ผ ์—…๋กœ๋“œ ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•  ์ผ์ด ์ƒ๊ธฐ๋ฉด ๋” ์‹ฌํ™”์‹œ์ผœ์„œ ๊ณต๋ถ€ ํ•ด๋ณผ ํ•„์š”๊ฐ€ ์žˆ๊ฒ ๋‹ค.

๋Œ“๊ธ€
๊ณต์ง€์‚ฌํ•ญ
์ตœ๊ทผ์— ์˜ฌ๋ผ์˜จ ๊ธ€
์ตœ๊ทผ์— ๋‹ฌ๋ฆฐ ๋Œ“๊ธ€
Total
Today
Yesterday
๋งํฌ
ยซ   2024/11   ยป
์ผ ์›” ํ™” ์ˆ˜ ๋ชฉ ๊ธˆ ํ† 
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
๊ธ€ ๋ณด๊ด€ํ•จ