Flare-k

[Add] File Upload

1 /* eslint-disable no-console */ 1 /* eslint-disable no-console */
2 +import routes from "../routes";
2 import File from "../models/File"; 3 import File from "../models/File";
3 4
4 export const home = async (req, res) => { 5 export const home = async (req, res) => {
...@@ -30,26 +31,24 @@ export const search = async (req, res) => { ...@@ -30,26 +31,24 @@ export const search = async (req, res) => {
30 // upload 또한 upload를 준비하기 위한 get 페이지와 실제 데이터를 보내는 post 페이지가 필요하다. 31 // upload 또한 upload를 준비하기 위한 get 페이지와 실제 데이터를 보내는 post 페이지가 필요하다.
31 export const getUpload = (req, res) => 32 export const getUpload = (req, res) =>
32 res.render("upload", { pageTitle: "Upload" }); 33 res.render("upload", { pageTitle: "Upload" });
34 +
33 export const postUpload = async (req, res) => { 35 export const postUpload = async (req, res) => {
34 // const {} 를 통해 body를 받아와 요청하는 정보들을 확인한다. 36 // const {} 를 통해 body를 받아와 요청하는 정보들을 확인한다.
35 // 이는 pug와 db.js를 확인해야하는 듯 하다. 37 // 이는 pug와 db.js를 확인해야하는 듯 하다.
36 const { 38 const {
37 - body: { title, description }, 39 + body: { title },
38 file: { path }, // path로 할때는 로컬의 경로. S3는 location 40 file: { path }, // path로 할때는 로컬의 경로. S3는 location
39 } = req; // file에 path라는 요소가 있다. 41 } = req; // file에 path라는 요소가 있다.
40 42
41 - const newVideo = await Video.create({ 43 + const newFile = await File.create({
42 fileUrl: path, 44 fileUrl: path,
43 title, 45 title,
44 - description, 46 + // 여기있는 fileUrl, title은 fileDB의 속성이다.
45 - creator: req.user.id,
46 - // 여기있는 fileUrl, title, description은 videoDB의 속성이다.
47 }); 47 });
48 - // console.log(newVideo); 48 +
49 - req.user.videos.push(newVideo.id); // user DB의 video atribute에 추가 49 + console.log(newFile);
50 - req.user.save(); 50 + res.redirect(routes.home);
51 - res.redirect(routes.videoDetail(newVideo.id)); // id는 DB의 id 51 +
52 - // id는 mongoDB가 랜덤하게 만들어준다.
53 }; 52 };
54 53
55 export const fileDetail = async (req, res) => { 54 export const fileDetail = async (req, res) => {
...@@ -73,12 +72,12 @@ export const deleteFile = async (req, res) => { ...@@ -73,12 +72,12 @@ export const deleteFile = async (req, res) => {
73 params: { id }, 72 params: { id },
74 } = req; 73 } = req;
75 try { 74 try {
76 - const video = await Video.findById(id); 75 + const file = await File.findById(id);
77 // video를 받아서 render로 통해 템플릿으로 던져준다, 76 // video를 받아서 render로 통해 템플릿으로 던져준다,
78 - if (String(video.creator) !== req.user.id) { 77 + if (String(file.creator) !== req.user.id) {
79 throw Error(); 78 throw Error();
80 } else { 79 } else {
81 - await Video.findOneAndRemove({ _id: id }); 80 + await File.findOneAndRemove({ _id: id });
82 } 81 }
83 } catch (error) { 82 } catch (error) {
84 console.log(error); 83 console.log(error);
......
1 +dotenv.config();
1 import dotenv from "dotenv"; 2 import dotenv from "dotenv";
2 import app from "./app"; // app.js에서 export default app했기 때문에 불러올 수 있다. 3 import app from "./app"; // app.js에서 export default app했기 때문에 불러올 수 있다.
3 import "./db"; 4 import "./db";
4 import "./models/File"; 5 import "./models/File";
5 6
6 -dotenv.config();
7 const PORT = process.env.PORT || 80; 7 const PORT = process.env.PORT || 80;
8 8
9 const handleListening = () => { 9 const handleListening = () => {
......
...@@ -12,11 +12,13 @@ const s3 = new aws.S3({ ...@@ -12,11 +12,13 @@ const s3 = new aws.S3({
12 region: "ap-northeast-2", 12 region: "ap-northeast-2",
13 }); 13 });
14 14
15 +const multerFile = multer({ dest: "uploads/files/" });
16 +
15 export const localsMiddleware = (req, res, next) => { 17 export const localsMiddleware = (req, res, next) => {
16 res.locals.siteName = "my Storage"; 18 res.locals.siteName = "my Storage";
17 res.locals.routes = routes; 19 res.locals.routes = routes;
18 - // res.locals.loggedUser = req.user || null;
19 - // console.log(req);
20 next(); 20 next();
21 }; 21 };
22 22
23 +export const uploadFile = multerFile.single("file");
24 +// single에 들어간 File은 upload.pug의 file 부분 input name
...\ No newline at end of file ...\ No newline at end of file
......
...@@ -17,7 +17,7 @@ const FileSchema = new mongoose.Schema({ ...@@ -17,7 +17,7 @@ const FileSchema = new mongoose.Schema({
17 }, 17 },
18 }); 18 });
19 // 이제 이 스키마를 이용하여 model을 만들어준다. 19 // 이제 이 스키마를 이용하여 model을 만들어준다.
20 -// 모델의 이름은 "Video" 20 +// 모델의 이름은 "File"
21 const model = mongoose.model("File", FileSchema); 21 const model = mongoose.model("File", FileSchema);
22 export default model; 22 export default model;
23 // 모델이 만들어짐을 알리기 위해 init.js에 import해준다. 23 // 모델이 만들어짐을 알리기 위해 init.js에 import해준다.
......
...@@ -6,11 +6,12 @@ import { ...@@ -6,11 +6,12 @@ import {
6 fileDetail, 6 fileDetail,
7 deleteFile, 7 deleteFile,
8 } from "../controllers/homeController"; 8 } from "../controllers/homeController";
9 +import { uploadFile } from "../middlewares";
9 const fileRouter = express.Router(); 10 const fileRouter = express.Router();
10 11
11 // Upload 12 // Upload
12 fileRouter.get(routes.upload, getUpload); 13 fileRouter.get(routes.upload, getUpload);
13 -fileRouter.post(routes.upload, postUpload); 14 +fileRouter.post(routes.upload, uploadFile, postUpload);
14 15
15 // File Detail 16 // File Detail
16 fileRouter.get(routes.fileDetail(), fileDetail); 17 fileRouter.get(routes.fileDetail(), fileDetail);
......
...@@ -5,6 +5,6 @@ block content ...@@ -5,6 +5,6 @@ block content
5 form(action=`/files${routes.upload}`, method="post", enctype="multipart/form-data") 5 form(action=`/files${routes.upload}`, method="post", enctype="multipart/form-data")
6 div.fileUpload 6 div.fileUpload
7 label(for="file") File 7 label(for="file") File
8 - input(type="file", id="file", name="file", required=true, accept = "file/*") 8 + input(type="file", id="file", name="file", required=true)
9 input(type="text", placeholder="Title", name="title", required=true) 9 input(type="text", placeholder="Title", name="title", required=true)
10 input(type="submit", value="Upload File") 10 input(type="submit", value="Upload File")
...\ No newline at end of file ...\ No newline at end of file
......