π‘ μ€μ΅ ν¬μΈνΈ!
- μ λ‘λ νμ΄μ§λ₯Ό λ§λ€μ΄μ ν΄λΉ νμ΄μ§μμ νμΌμ μ λ‘λν κ²½μ° μ΄λ―Έμ§μΈ κ²½μ°μλ§ μ μμ μΌλ‘ μ λ‘λκ° λλλ‘ νλ€.
- μ λ‘λν μ΄λ―Έμ§λ μμ νλ νλ λ΄μ μ μ₯λκ³ , μ μ₯λ μ΄λ―Έμ§λ₯Ό νΉμ νμ΄μ§λ‘ λΆλ¬μ¬ μ μλλ‘ νλ€.
π μ λ‘λν μ΄λ―Έμ§λ₯Ό μ μ₯νλ λ°©λ² μμ보기
- μ΄λ€ μ¬μ΄νΈλ₯Ό μ΄μνλ μ΄λ―Έμ§λ₯Ό μ λ‘λνκ³ λ³΄μ¬μ€μΌ νλ μΌμ΄ λ§μ΄ λ°μνλ―λ‘, μ΄λ―Έμ§λ₯Ό μ΄λ»κ² μ΄λμ μ μ₯ν μ§μ λν κ³ λ―Όμ νμνλ€.
1. JavaScript νμΌ κ·Όμ²μ ν΄λλ₯Ό νλ λ§λ€μ΄μ μ μ₯νλ λ°©λ² : μ€λ μ€μ΅ λ μ¬μ©
2. μλ§μ‘΄ λ± νλλ₯Ό ꡬ맀νμ¬ μ μ₯νλ λ°©λ² (Amazon S3) : μ μ₯ν μ΄λ―Έμ§κ° λ§μ κ²½μ° μ¬μ©
3. DB μ μ§μ μ μ₯νλ λ°©λ²
- μ΄ λ°©λ²λ€ μ€ 3λ²μ§Έ λ°©λ²μ μλ, λΉμ©, μ©λ λ± λ€μν μΈ‘λ©΄μμ μ’μ λ°©λ²μ΄λΌνκΈ°μ μ΄λ €μ°λ―λ‘ μ£Όλ‘ 1λ²μ§Έλ 2λ²μ§Έ λ°©λ²μ μ¬μ©νλ€.
- νμ§λ§ μ΄λ―Έμ§λ₯Ό λκ°, μ΄λμ, μ΄λ€ μ΄λ¦μΌλ‘ μ λ‘λνλμ§μ κ°μ λ©ν μ 보λ DB μ μ μ₯νλ κ²μ΄ μΉκ°λ° κ΄μ΅μ΄λ κΈ°μ΅ν΄λμ.
π μ΄λ―Έμ§λ₯Ό μ λ‘λν νμ΄μ§ λ§λ€κΈ°
- μ λ‘λ νμ΄μ§μλ μ λ‘λ λ²νΌκ³Ό μ μ‘ λ²νΌλ§ μμΌλ©΄ μΆ©λΆνλ€.
π€ μ λ‘λ EJS νμΌ λ§λ€κΈ°
<h4 class="container mt-5"><strong>μ
λ‘λ νμ΄μ§</strong></h4>
<div class="container mt-4">
<form action="/upload" method="POST" enctype="multipart/form-data">
<input type="file" name="image">
<button type="submit" class="btn btn-primary">μ
λ‘λ</button>
</form>
</div>
- form νκ·Έμ action μμ±μλ /upload κ²½λ‘λ₯Ό, enctype μλ multipart/form-data λ₯Ό μμ±ν΄μ£Όμλ€.
(μ°Έκ³ λ‘ enctype μ 보λ΄λ νμΌμ μΈμ½λ© νμμΌλ‘, νμΌμ΄λ μ΄λ―Έμ§ μ λ‘λμ κ²½μ° multipart/form-data λ₯Ό μ¬μ©νλ κ² μ’λ€κ³ νλ€.) - input νκ·Έμλ type μ file λ‘ μμ±ν΄μ£Όμλ€. μ΄λ κ² μμ±νλ©΄ νμΌ μ ν λ²νΌ λ° μ νλ νμΌλͺ μ΄ νμνλ λΆλΆμ΄ μκΈ΄ κ±Έ νμΈν μ μλ€.
- input νκ·Έμ name μμ±μ μΆκ°νμ¬ image λΌλ κ°μ λ£μ΄μ£Όμλ€. (μ΄ λΆλΆμ μΆν μ¬μ© μμ )
- button νκ·Έμ type λ λ€λ₯Έ νΌ μμμμμ λμΌνκ² form λ΄μ©μ μ μ‘ν μ μλλ‘ submit μΌλ‘ μμ±ν΄μ£Όμλ€.
π€ JavaScript νμΌμμ λΌμ°ν μ€μ νκΈ°
app.get('/upload', function(req, res){
res.render('upload.ejs')
})
- λκ΅°κ°κ° /upload κ²½λ‘λ‘ GET μμ²μ νλ κ²½μ°, μ λ‘λ νμ΄μ§κ° λμ¬ μ μκ² μ€μ ν΄μ£Όμλ€.
π μ λ‘λν μ΄λ―Έμ§ νλμ μ μ₯ν μ μκ² μ ν νκΈ°
- μ¬μ©μκ° μ λ‘λν μ΄λ―Έμ§λ₯Ό μλ²λ₯Ό λλ¦¬κ³ μλ μ»΄ν¨ν°μ κ·Έλλ‘ μ μ₯ν΄λ³΄μλ€.
- μ°Έκ³ λ‘ λλ μμ ν΄λ λ΄μ public/images λΌλ ν΄λλ₯Ό μμ±νμ¬ μ λ‘λν μ΄λ―Έμ§λ₯Ό μ μ₯νλ€.
π€ multer λΌμ΄λΈλ¬λ¦¬ μ€μΉνκΈ°
- multipart/form-data λ₯Ό ν΅ν΄ μ λ‘λν νμΌμ μ½κ² μ μ₯ λ° μ²λ¦¬λ₯Ό νκΈ° μν΄μλ multer λΌμ΄λΈλ¬λ¦¬ μ€μΉκ° νμνλ€.
- ν°λ―Έλμ μΌ ν npm install multer λ₯Ό μ λ ₯νλ€.
- μ€μΉκ° λλλ©΄ JavaScript νμΌμ multer μ ν μ λ€μκ³Ό κ°μ΄ μ§ννλ©΄ λλ€.
let multer = require('multer'); // μ€μΉν΄λ multer λ₯Ό κ°μ Έλ€ μ°κ² λ€λ μλ―Έ
var storage = multer.diskStorage({
destination : function(req, file, cb){
cb(null, './public/images')
},
filename : function(req, file, cb){
cb(null, file.originalname)
}
});
var upload = multer({storage : storage});
1. .diskStorage() : μ λ‘λν νμΌμ νλμ μ μ₯νλ μ©λμ ν¨μμ΄λ€.
(λ¨μ μ μ₯νκ³ μΆλ€λ©΄ memoryStorage λΌκ³ μ¨λ λμ§λ§, νλ°μ±μμ κ°μν΄μΌ νλ€.)
2. destination : μ λ‘λν νμΌμ μ μ₯ν νλμ κ²½λ‘λ₯Ό μ€μ νλ λΆλΆμ΄λ€.
(λλ μμ λ§νλ―μ΄ public/images ν΄λλ₯Ό μμ±νμ¬ μ μ₯ν κ²μ΄λΌ μμ κ°μ΄ μ½λλ₯Ό μμ±νλ€.)
3. filename : μ μ₯ν λ μ΄λ€ μ΄λ¦μΌλ‘ νμΌμ μ΄λ¦μ μ μ₯ν μ§ κ²°μ νλ λΆλΆμ΄λ€.
(file.originalname μ΄λΌκ³ μμ±νλ©΄ μλ³Έ κ·Έλλ‘ μ μ₯νκ² λ€λ μλ―Έμ΄λ€.)
4. var upload : upload λΌλ λ³μλ₯Ό μμ±νμ¬ multer μ ν μ μ μ₯ν΄μ£Όλ©΄ λ!
π νν° κΈ°λ₯μΌλ‘ μνλ νμ₯μμ ν΄λΉνλ μ λ‘λ νμΌλ§ κ±°λ₯΄λ λ°©λ² μμ보기
var path = require('path');
var upload = multer({
storage: storage,
fileFilter: function (req, file, cb) {
var ext = path.extname(file.originalname);
if(ext !== '.png' && ext !== '.jpg' && ext !== '.jpeg') {
return cb(new Error('PNG, JPG νμΌλ§ μ
λ‘λ κ°λ₯ν©λλ€.'));
}
cb(null, true)
},
limits:{
fileSize: 1024 * 1024
}
});
- μ ν νλ λΆλΆ μμ fileFilter λΌλ νλͺ©μ μΆκ°νλ©΄ λλ€.
- path λΌλ λ³μλ node.js κΈ°λ³Έ λ΄μ₯ λΌμ΄λΈλ¬λ¦¬ path λ₯Ό νμ©ν΄ νμΌμ κ²½λ‘, μ΄λ¦, νμ₯μ λ±μ μμλΌ λ μ¬μ©νλ€.
- limits λ νμΌ μ¬μ΄μ¦μ μ νμ κ±Έκ³ μΆμ λ μ¬μ©νλ€.
π μ΄λ―Έμ§ μ μ‘ μ€νν΄λ³΄κΈ°
app.post('/upload', upload.single('image'), function(req, res){
res.send('νμΌ μ
λ‘λ μλ£')
});
- λκ΅°κ°κ° μ λ‘λ νμ΄μ§μμ μ μ‘ λ²νΌμ λλ¬ /upload κ²½λ‘λ‘ POST μμ²μ νλ©΄, νμΌμ μ μ‘κ³Ό ν¨κ» 'νμΌ μ λ‘λ μλ£' λΌλ 문ꡬλ₯Ό λμμ£Όλλ‘ νλ€.
- μ¦, λκ΅°κ°κ° /upload λ‘ POST μμ²μ νλ©΄ upload.single('input μ name μμ±') μ΄λΌλ λ―Έλ€μ¨μ΄κ° μ€νμ΄ λκ³ multer μ
ν
λλ‘ μ
λ‘λν νμΌμ΄ μ²λ¦¬λλ κ²μ΄λ€.
(input μ name μμ±μλ λ³ΈμΈμ΄ μ€μ ν name μμ±κ°, μ¦ λμ κ²½μ°μλ image λ₯Ό μ μ΄μ£Όλ©΄ λλ€.)
π€ μ΄λ―Έμ§ μ μ‘ μ
- κΈ°μ‘΄ μμ ν΄λμ public/images μλ μλ¬΄λ° νμΌλ μμλ€.
π€ μ΄λ―Έμ§ μ μ‘
π€ μ΄λ―Έμ§ μ μ‘ ν
- κΈ°μ‘΄ μμ ν΄λμ public/images μ μ μ‘λ profile.jpg κ° μ μ₯λ κ²μ μ μ μλ€.
π μ λ‘λν μ΄λ―Έμ§ 보μ¬μ£ΌκΈ° (μ΄λ―Έμ§ API λ§λ€κΈ°)
π€ JavaScript νμΌ μ½λ μμ±νκΈ°
app.get('/images/:img', function(req, res){
res.sendFile(__dirname + '/public/images/' + req.params.img)
})
- λκ΅°κ°κ° /images/:νλΌλ―Έν°λ‘ GET μμ²μ νλ©΄ /public/images/ λ΄μμ :νλΌλ―Έν°μ ν΄λΉνλ μ΄λ―Έμ§λ₯Ό 보λ΄λ¬λΌκ³ μμ±νλ€.
π€ μ€μ κ²½λ‘μμ νμΈν΄λ³΄κΈ°
- μ€μ λ‘ /images/profile.jpg μ GET μμ²μ ν΄λ³΄λ©΄ μλμ κ°μ΄ λΈλΌμ°μ μ μ΄λ―Έμ§κ° μ μμ μΌλ‘ λμ€λ κ²μ νμΈν μ μλ€.
π€ νΉμ νμ΄μ§μ μ λ‘λν μ΄λ―Έμ§ λΆλ¬μ€κΈ°
- λλ νμΌλ‘ μ΄λ―Έμ§λ₯Ό λΆλ¬μ€λ κ²μΌλ‘ ν μ€νΈν΄λ³΄μλ€.
<h4 class="container mt-5"><strong>ν</strong></h4>
<div class="container mt-4 text-center">
<img src="/images/profile.jpg" style="width: 80%">
</div>
- ννμ΄μ§ EJS νμΌμ μμ κ°μ΄ img νκ·Έλ₯Ό λ£μ΄μ£Όκ³ src λ '/images/profile.jpg' λ‘ λ£μ΄μ£Όμλ€.
- κ·Έλ¬λ©΄ ννμ΄μ§μμ μμ κ°μ΄ μ΄λ―Έμ§κ° λ¨λ κ²μ νμΈν μ μλ€.
'[κ°λ°] Practice > Node.js MongoDB' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[Node.js / MongoDB] μ±ν κΈ°λ₯ λ§λ€κΈ° (0) | 2022.03.18 |
---|---|
[Node.js / MongoDB] νμ κΈ°λ₯μ ν¬ν¨ν κ²μν κΈ°λ₯ λ§λ€κΈ° (0) | 2022.03.15 |
[Node.js / MongoDB] κ²μ κΈ°λ₯ λ§λ€κΈ° (1) | 2022.03.14 |
[Node.js / MongoDB] νμμΈμ¦κΈ°λ₯ λ§λ€κΈ° (0) | 2022.03.14 |
[Node.js / MongoDB] κΈ μμ κΈ°λ₯ λ§λ€κΈ° (0) | 2022.03.12 |