κ²μνμ μ΄λ―Έμ§ μ λ‘λ κΈ°λ₯ μΆκ°νκΈ°
multer λͺ¨λ
multer λͺ¨λμ multipart/form-data
λ₯Ό μ²λ¦¬νκΈ° μν node.js λ―Έλ€μ¨μ΄μ
λλ€.
μ΄λ² ν¬μ€ν
μμλ μ§λ ν¬μ€ν
μ μ΄μ΄μ node.js
μμ μ΄λ―Έμ§(νμΌ)λ₯Ό μ
λ‘λνλ λ°©λ²μ λν΄ μ΄ν΄λ³΄κ² μ΅λλ€.
νμ¬ κ²μν κΈμ°κΈ° νλμλ λ€μκ³Ό κ°μ΄ μ΄λ―Έμ§ μ
λ‘λ κΈ°λ₯μ΄ μλ μνλΌμ multer
λͺ¨λμ ν΅ν΄
κ²μκΈλ§λ€ μ΄λ―Έμ§λ₯Ό μ
λ‘λνκ³ λ°μ΄ν°λ² μ΄μ€μ μ μ₯νλλ‘ νκ² μ΅λλ€.
ν¨ν€μ§ μ€μΉ
$ npm i multer
MySQL μ»¬λΌ μΆκ°
κΈ°μ‘΄μ κ²μκΈ ν μ΄λΈμ λ€μκ³Ό κ°μ ννλ₯Ό λκ³ μμ΅λλ€.
mysql> desc board;
+------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+--------------+------+-----+---------+----------------+
| idx | int unsigned | NO | PRI | NULL | auto_increment |
| creator_id | varchar(100) | NO | | NULL | |
| title | varchar(100) | NO | | NULL | |
| content | mediumtext | NO | | NULL | |
| passwd | varchar(100) | NO | | NULL | |
| hit | int unsigned | NO | | 0 | |
+------------+--------------+------+-----+---------+----------------+
μ΄μ κ° κ²μκΈλ§λ€ μ΄λ―Έμ§λ₯Ό μΆκ°μ μΌλ‘ κ΄λ¦¬ν΄μΌνλ―λ‘ μ΄λ―Έμ§ κ²½λ‘λ₯Ό μ μ₯ν 컬λΌμ μλ‘ λ§λ€μ΄μ€λλ€.
λ°μ΄λ리 λ°μ΄ν°λ‘ DBμ μ μ₯ν κ²½μ° λΆνκ° ν¬κΈ° λλ¬Έμ
μ΄λ―Έμ§ κ²½λ‘λ§ μ μ₯ν΄λκ³ μλ²μμ λ‘λν΄μ μ 곡ν΄μ£Όλ ννλ‘ ν κ²μ
λλ€.
mysql> ALTER TABLE board ADD image VARCHAR(200) NOT NULL DEFAULT '';
μ΄μ λ€μ κ²μκΈ ν μ΄λΈμ νμΈν΄λ³΄λ©΄ λ€μκ³Ό κ°μ΄ μλ‘μ΄ μ»¬λΌμ΄ μΆκ°λ κ²μ νμΈν μ μμ΅λλ€.
mysql> desc board;
+------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+--------------+------+-----+---------+----------------+
| idx | int unsigned | NO | PRI | NULL | auto_increment |
| creator_id | varchar(100) | NO | | NULL | |
| title | varchar(100) | NO | | NULL | |
| content | mediumtext | NO | | NULL | |
| passwd | varchar(100) | NO | | NULL | |
| hit | int unsigned | NO | | 0 | |
| image | varchar(200) | NO | | | | <== π‘
+------------+--------------+------+-----+---------+----------------+
νμΌ μ λ‘λ νΌ μμ±
μ΄μ κΈ°μ‘΄μ κΈ μμ± νΌμμ μ΄λ―Έμ§ μ
λ‘λλ₯Ό μν νμΌ μ ν μ°½μ μλ‘ μΆκ°ν΄μ€λλ€.
form νκ·Έμ μμ±μΌλ‘ enctype="multipart/form-data"
κ° μ§μ λμ΄μΌ ν¨μ μ μν©λλ€.
write.ejs
<form action="/board/write" method="post" enctype="multipart/form-data">
<table border="1">
<!-- μ€λ΅ -->
<tr>
<td>μ΄λ―Έμ§</td>
<td><input type="file" name="image" /></td>
</tr>
<tr>
<td colspan="2">
<button type="submit">κΈμ°κΈ°</button>
</td>
</tr>
</table>
</form>
router & multer μ€μ
κ²μκΈ μ λ‘λλ₯Ό λ΄λΉνλ λΌμ°νΈ νμΌμ κ°μ λͺ κ°μ§ μ€μ μ ν΄μ€λλ€.
νμΌμ΄ μ μ₯λ κ²½λ‘λ νμΌλͺ
μ λ³κ²½ν΄μ£ΌκΈ° μν΄μλ multer
κ°μ²΄μ μ΅μ
μ λ³κ²½ν΄μ£Όλ©΄ λ©λλ€.
μ¬κΈ°μλ νμ¬ λ μ§λ₯Ό νμΌλͺ
μ μΆκ°νμ¬ μ€λ³΅λ μ¬μ§μ΄ μμ±λλ κ²μ λ°©μ§νλλ‘ νκ² μ΅λλ€.
μ΄λ―Έμ§ μ
λ‘λλ₯Ό λ΄λΉνλ λΌμ°ν° νμΌ μλ¨μ λ€μκ³Ό κ°μ μ½λλ₯Ό ν΅ν΄ μ€μ μ ν΄μ€λλ€.
express νλ‘μ νΈ μμ± μ κΈ°λ³Έμ μΌλ‘ μ 곡λλ public/images
λλ ν 리 νμμ μ΄λ―Έμ§λ€μ μ μ₯ν΄μ£Όλλ‘ νκ² μ΅λλ€.
routes/board.js
const multer = require("multer");
const path = require("path");
var storage = multer.diskStorage({
destination: function (req, file, cb) {
cb(null, "public/images/");
},
filename: function (req, file, cb) {
const ext = path.extname(file.originalname);
cb(null, path.basename(file.originalname, ext) + "-" + Date.now() + ext);
},
});
var upload = multer({ storage: storage });
λν κ²μκΈ νλμλ νλμ μ΄λ―Έμ§κ° μ‘΄μ¬νλ―λ‘ upload.single('image')
λ‘
μ΄λ―Έμ§ μ²λ¦¬λ₯Ό μν λ―Έλ€μ¨μ΄λ₯Ό μμ±ν©λλ€.
μ¬κΈ°μ image
λ input
νκ·Έμ name
μμ±κ°μ
λλ€.
μκΉμ λμΌνκ² board.js
μ νμΌ μ
λ‘λλ₯Ό λ΄λΉνλ λΌμ°ν°μ λ―Έλ€μ¨μ΄λ₯Ό μ€μ ν΄μ€λλ€.
routes/board.js
// ... μ€λ΅
// νμΌ μ
λ‘λ λΌμ°ν°
router.post("/write", upload.single("image"), (req, res, next) => {
const creator_id = req.body.creator_id;
const title = req.body.title;
const content = req.body.content;
const passwd = req.body.passwd;
const image = `/images/${req.file.filename}`; // image κ²½λ‘ λ§λ€κΈ°
const datas = [creator_id, title, content, passwd, image];
const sql =
"INSERT INTO board(creator_id, title, content, passwd, image) values(?, ?, ?, ?, ?)";
connection.query(sql, datas, (err, rows) => {
if (err) {
console.error("err : " + err);
} else {
console.log("rows: " + JSON.stringify(rows));
res.redirect("/board");
}
});
});
μ΄λ―Έμ§ μ μ₯ νμΈ
μ΄μ ν°λ―Έλμ μ΄κ³ μλ‘μ΄ κ²μκΈμ μμ±ν λ€ μΏΌλ¦¬λ¬Έμ ν΅ν΄ λ μ½λλ₯Ό νμΈν΄λ³΄λ©΄
λ€μκ³Ό κ°μ΄ μ΄λ―Έμ§ κ²½λ‘κ° μ μ₯λ κ²μ νμΈν μ μμ΅λλ€.
κΈ°μ‘΄μ μ΄λ―Έμ§κ° μλ κ²μκΈλ€μ κΈ°λ³Έκ°μ΄ μ€μ λμ΄ μλ κ²μ νμΈν μ μμ΅λλ€.
mysql> select * from board;
+-----+------------+----------------------+---------------------+--------+-----+--------------------------------
| idx | creator_id | title | content | passwd | hit | image |
+-----+------------+----------------------+---------------------+--------+-----+--------------------------------
| 12 | simpson | springfield | κ²μκΈ μμ± | 1234 | 0 | |
| 15 | apple | lenna | lenna test | 1234 | 0 | /images/lenna-1589908536559.png |
+-----+------------+----------------------+---------------------+--------+-----+--------------------------------
λν λ‘컬 νκ²½μ μ΄λ―Έμ§κ° μ¬λ°λ₯΄κ² μ μ₯λμλμ§ νμΈν΄λ΄ μλ€.
public/images/
νμμ λ€μκ³Ό κ°μ΄ μ μ₯λ μκ°κ³Ό ν¨κ»
μλ‘μ΄ νμΌλͺ
μ λ§λ λ€ μ μ₯λμ΄μλ κ²μ νμΈν μ μμ΅λλ€.
κ²μκΈ μ΄λ―Έμ§ μΆλ ₯
νμ¬λ κ²μκΈ μ‘°ν μ μ μ₯λ μ΄λ―Έμ§λ₯Ό μΆλ ₯νμ§ λͺ»νλ μνμ λλ€.
μ΄μ κ²μκΈ μ‘°ν μ μ΄λ―Έμ§λ₯Ό κ°μ΄ μΆλ ₯ν΄μ€ μ μλλ‘ κΈ°μ‘΄μ λΌμ°ν°λ₯Ό μμ νκ² μ΅λλ€.
κΈ°μ‘΄ 쿼리문μ μμ² νλμ image
λ₯Ό μΆκ°ν΄μ€λλ€.
routes/board.js
router.get("/read/:idx", (req, res, next) => {
const idx = req.params.idx;
const sql =
"SELECT idx, creator_id, title, content, hit, image FROM board WHERE idx=?";
connection.query(sql, [idx], (err, row) => {
if (err) {
console.error(err);
} else {
res.render("read", { title: "κΈ μ‘°ν", row: row[0] });
}
});
});
κ·Έλ¦¬κ³ ejs νμΌμμ img
νκ·Έλ₯Ό ν΅ν΄ μ μ νμΌμ νλ©΄μ μΆλ ₯νλλ‘ ν©λλ€.
μ΄λ μ΄λ―Έμ§ μμ€λ μλ²λ‘λΆν° μ λ¬λ°μ row
κ°μ²΄μμ κ°μ Έμ€λλ‘ ν©λλ€.
read.ejs
<table>
<!-- μ€λ΅ -->
<tr>
<td>μ΄λ―Έμ§</td>
<td><img src="<%= row.image %> " alt="μ΄λ―Έμ§" width="300" /></td>
</tr>
</table>
κ²°κ³Ό νμΈ
μ°Έκ³ μλ£
'π¨βπ» web.dev > node' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
TypeDI λ₯Ό νμ©ν μμ‘΄μ± μ£Όμ (0) | 2022.05.28 |
---|---|
Node.js μλ²μ Redis μ μ©νκΈ° (1) | 2022.05.28 |
Node.jsμ MySQLλ₯Ό μ΄μ©ν κ²μκΈ μμ±νκΈ° νν λ¦¬μΌ (0) | 2021.03.05 |
Sequelize ORMμμ migration νμ©νκΈ° (0) | 2021.03.03 |
Node.js νκ²½μμ λ€μ΄λ² Open API νμ©νκΈ° (0) | 2021.03.02 |
π¬ λκΈ