코드코코

210916 [6장] 6.2 자주 사용하는 미들웨어2 본문

기록/node.js 교과서 따라하기

210916 [6장] 6.2 자주 사용하는 미들웨어2

코드코코 2021. 9. 16. 21:28

1. multer.js

const multer = require('multer');

//multer 함수의 인수로 설정을 넣는다.
const upload = multer({
    //storage속성: destination(어디)에 filename(어떤이름)으로 저장할지 넣는다.
    storage: multer.diskStorage({
        //매개변수
        //req : 요청에 대한 정보
        //file : 업로드한 파일에 대한 정보
        //done(에러있으면에러,실제경로나 파일이름)
        //req나 file의 데이터를 가공해서 done으로 넘기는 형식.
        //현재설정으로는 uploads폴더에 [파일명+현재시간.확장자] 파일명으로 업로드.
        destination(req, file, done) {
            done(null, 'uploads/');
        },
        filename(req, file, done) {
            const ext = path.extname(file.originalname);
            done(null, path.basename(file.originalname, ext) + Date.now() + ext);
        },
    }),
    //limits 속성 : 업로드에 대한 제한 사항 설정.
    limits: { fileSize: 5 * 1024 * 1024 },
})

//위 설정을 사용하기 위해서는 서버에 uploads폴더가 꼭 있어야 함.
//없다면 직접 만들어주거나 다음과 같이 fs모듈을 사용해서 서버를 시작할 때 생성.

const fs = require('fs');

try {
    fs.readdirSync('uploads');
} catch (error) {
    console.error('uploads 폴더가 없어 uploads 폴더를 생성합니다.');
    fs.mkdirSync('uploads');
}

//설정이 끝나면 upload변수가 생기는 데 여기에 다양한 종류의 미들웨어가 있다.
//single 미들웨어를 라우터 미들웨어 앞에 넣어두면, multer설정에 따라 파일 업로드 후 req.file객체가 생성됨.
//인수는 input 태그의 name이나 폼데이터의 키와 일치하게 넣으면 됨.
//업로드 성공 시 결과는 req.file 객체 안에, req.body에는 파일이 아닌 데이터인 title이 들어 있음
//파일을 하나만 업로드 하는 경우 single 미들웨어 사용
fs.appendFile.post('/upload', upload.single('image'), (req, res) => {
    console.log(req.file, req.body);
    res.send('ok');
});

//req.file 객체형식
// {
//     filename: 'img'
//     originalname : 'nodejs.png'
//     encoding:'7bit'
//     mimeType: 'image/png'
//     destination:'uploads/'
//     filename: 'nodejs1514.png'
//     path:'uploads\\nodejs1514.png'
//     size:53357
// }


//여러 파일 업로드 : html input태그에 multiple 입력, 미들웨어는 array로 교체.
//업로드 결과 req.files 배열에 있음.

app.post('/upload', upload.array('many'), (req, res) => {
    console.log(req.files, req.body);
    res.send('ok');
})

//fileds 미들웨어 사용 : 파일을 여러개 업로드하지만 input 태그나 폼 데이터의 키가 다른 경우
//업로드 결과 req.files.image1 과 req.files.image2에 있음.

app.post('/upload',
    upload.fields([{ name: 'image1' }, { name: 'image2' }]),
    (res, req) => {
        console.log(req.files, req.body);
        res.send('ok');
    },
);

//파일을 업로드 하지 않고 멀티파트형식으로 업로드 하는 특수한 경우
//파일을 업로드 하지 않았으므로 req.body만 존재.
app.post('/upload', upload.none(), (req, res) => {
    console.log(req.body);
    res.send('ok');
});

2.app_ver6.js : 기존 app.js에  multer 추가 

const multer = require('multer');
const fs = require('fs');

try {
    fs.readdirSync('uploads');
} catch (error) {
    console.error('uploads 폴더가 없어 uploads 폴더를 생성합니다.');
    fs.mkdirSync('uploads');
}

const upload = multer({
    storage: multer.diskStorage({
        destination(req, file, done) {
            done(null, 'uploads/');
        },
        filename(req, res, done) {
            const ext = path.extname(file.originalname);
            done(null, path.basename(file.originalname, ext) + Date.now() + ext);
        },
    }),
    limits: { fileSize: 5 * 1024 * 1024 },
});

app.get('/upload', (req, res) => {
    res.sendFile(pathe.join(__dirname, 'multipart3.html'))
})

app.post('/upload',
    upload.fields([{ name: 'image1' }, { name: 'image2' }]),
    (res, req) => {
        console.log(req.files, req.body);
        res.send('ok');
    },
);