Flare-k

[Add] File Upload

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