ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

Node.js์™€ Vue (๋ฌผ๋ก  ๊ธฐ๋ณธ์ ์ธ html๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค) ๋ฅผ ์ด์šฉํ•˜์—ฌ ์„œ๋ฒ„๋‹จ์— ์žˆ๋Š” ํŒŒ์ผ์„ ๋‹ค์šด๋กœ๋“œํ•˜๋Š” ์ฝ”๋“œ์ƒ˜ํ”Œ์ž…๋‹ˆ๋‹ค.

 

๊ธฐ๋ณธ์ ์ธ express ์„œ๋ฒ„๋ฅผ ๋„์šฐ๋Š” ์„ค์ •์ด๋‚˜ ์‹คํ–‰ํ™˜๊ฒฝ ์…‹ํŒ…์€ ์ œ์™ธํ•˜์˜€์Šต๋‹ˆ๋‹ค.

 

[router.js]

1
2
3
4
5
const util = require('./util.js')
 
router.get('/download',(req, res, next)=>{
    util.download(req, res)
})
cs

์ผ๋‹จ ๊ธฐ๋ณธ์ ์ธ ๋ผ์šฐํ„ฐ ์…‹ํŒ…์ž…๋‹ˆ๋‹ค. ๋‹จ์ˆœํ•˜๊ฒŒ /download ๋ผ๋Š” ๋ผ์šฐํ„ฐ๋กœ ์ง„์ž…ํ–ˆ์„ ๋•Œ util.js ํŒŒ์ผ์— ์žˆ๋Š” download ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰์‹œ์ผœ์ฃผ๋Š” ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. 

 

[util.js]

1
2
3
4
5
6
7
8
9
10
11
exports.download = (req, res) => {
    const date = new Date()
    res.setHeader("Content-disposition""attachment; filename="+ date.yyyymmddhhmmss() +'.csv');
    res.set('Content-Type''text/csv');
    fs.createReadStream(`./data.csv`)
    .pipe(res)
    .on('finish', ()=>{
        console.log('download complete')
    })
})
 
cs

header๋ฅผ ์ •์˜ํ•ด์ฃผ๋Š” ๋ถ€๋ถ„์„ ๋จผ์ € ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์ผ ํƒ€์ž…๊ณผ ํŒŒ์ผ ์ €์žฅ์‹œ์— ํŒŒ์ผ๋ช…์„ ์‹œ์Šคํ…œ ์‹œ๊ฐ„์œผ๋กœ ์ •์˜ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  CreateReadStream์„ ์ด์šฉํ•˜์—ฌ ์„œ๋ฒ„์— ์žˆ๋Š” ํŠน์ • ํŒŒ์ผ์„ ๋‹ค์šด๋กœ๋“œ ํ•  ์ˆ˜ ์žˆ๊ฒŒ๋” ํŒŒ์ผ๋ช…์„ ๋„ฃ์–ด์ค๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ pipe ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด์„œ ํ•ด๋‹น ์ŠคํŠธ๋ฆผ์„ response๋กœ ์ „์†กํ•ฉ๋‹ˆ๋‹ค.

 

๋ฐฑ์—”๋“œ์ชฝ ์ž‘์—…์€ ๋๋‚ฌ์Šต๋‹ˆ๋‹ค. ์ด์ œ ๊ฐ„๋‹จํ•˜๊ฒŒ ํ”„๋ก ํŠธ๋‹จ์—์„œ ๋ฒ„ํŠผ๊ณผ ํ•ด๋‹น API๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

 

[index.vue]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<template>
    <div>
        <button @click="download">CSV ๋‹ค์šด๋กœ๋“œ</button>
    </div>
</template>
 
<script>
export default {
    name'download',
    data() {
        return {
        }
    },
    methods: {
        download() {
            try {
                let element = document.createElement('a');
                element.setAttribute('href','/download');
                element.click();
            } catch(error) {
                console.log(error)
            }
        }
    },
}
</script>
cs

Vue.js ์ฝ”๋“œ์ด๊ธดํ•˜์ง€๋งŒ, HTML์˜ ์•„์ฃผ ๋‹จ์ˆœํ•œ ์ฝ”๋“œ๋ฅผ ์˜ฎ๊ธด ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. ํ™”๋ฉด์— ๋ฒ„ํŠผ์ด ์žˆ๊ณ , ํ•ด๋‹น ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅผ ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์ด๋ฒคํŠธ ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•œ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. download ํ•จ์ˆ˜์—๋Š” ๋‹จ์ˆœํ•˜๊ฒŒ download ๋ผ์šฐํ„ฐ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ์ „๋ถ€์ž…๋‹ˆ๋‹ค.

 

๋ฌผ๋ก  axios๋‚˜ form tag ๊ฐ™์ด ๋ผ์šฐํ„ฐ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ํ•ด๋„ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค.

 

๊ธฐ์กด ์†Œ์Šค์—์„œ ํ•ด๋‹น ๊ธฐ๋Šฅ๋งŒ ๋ฐœ์ทŒํ•˜์—ฌ ์ž‘์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•œ ๋ชจ์Šต์€ ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

ํŒŒ์ผ ๋‹ค์šด๋กœ๋“œ ํŽ˜์ด์ง€

์„œ๋ฒ„์— ์žˆ๋Š” ํŒŒ์ผ์„ ํด๋ผ์ด์–ธํŠธ์˜ PC์—์„œ ๋‹ค์šด๋กœ๋“œ ๋ฐ›์„ ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํŒŒ์ผ๋ช…์€ ์œ„ ์„œ๋ฒ„ ์ฝ”๋“œ์—์„œ ์ž‘์„ฑํ–ˆ๋‹ค์‹œํ”ผ ์‹œ์Šคํ…œ ์‹œ๊ฐ„์˜ ์‹œ๋ถ„์ดˆ์˜ ํŒŒ์ผ๋ช…์œผ๋กœ ๊ธฐ๋ณธ์…‹ํŒ…๋˜์—ˆ์Šต๋‹ˆ๋‹ค. 

๋Œ“๊ธ€
๊ณต์ง€์‚ฌํ•ญ
์ตœ๊ทผ์— ์˜ฌ๋ผ์˜จ ๊ธ€
์ตœ๊ทผ์— ๋‹ฌ๋ฆฐ ๋Œ“๊ธ€
Total
Today
Yesterday
๋งํฌ
ยซ   2024/11   ยป
์ผ ์›” ํ™” ์ˆ˜ ๋ชฉ ๊ธˆ ํ† 
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
๊ธ€ ๋ณด๊ด€ํ•จ