node.js:《介面實現檔案的上傳和下載》

2022-10-29 18:02:13

使用node.js寫上傳檔案和下載檔案的介面

上傳介面:

開始寫介面前,我們先安裝一個上傳檔案的外掛:npm install multer

安裝成功在package.json或package-lock.json包中能看到

在主檔案引入模組:

//組態檔上傳臨時目錄
const upload = multer({
    dest:'./public/upload/temp'//臨時存放路徑
})

設定所有介面可下載

//設定所有介面都允許上傳功能
uploadFile.use(upload.any())

然後在路由中引入fs模組,寫一個上傳功能的介面

const fs = require("fs");//重新定義檔案模組

router.post('/upload', (req, res) => {
    //檢查是否有檔案
    if (!req.files) {//如果req是空 返回400
        res.send({
            code: 400,
            msg: '上傳檔案不能為空',
        });
        return;
    }

        //儲存檔案
        let files = req.files; //將獲取的檔案放到files
        let ret_files = []; //定義一個空陣列
        for (let file of files) {//將files迴圈成單個
            //獲取名字字尾
            let file_ext = file.originalname.substring(file.originalname.lastIndexOf('.') + 1);
            //將檔名改為時間戳
            let file_name = new Date().getTime() + '.' + file_ext
            //移動檔案並且修改檔案名字 
            fs.renameSync(
                process.cwd() + "/public/upload/temp/" + file.filename,//file.filename:檔案最初名字  /public/upload/temp/作為中轉站
                process.cwd() + "/public/upload/" + file_name, //file_name:時間戳新起的名字
            );
            //將改完的檔案寫進空陣列
            ret_files.push("./public/upload/" + file_name)
        }

        res.send({
            code: 200,
            msg: 'OK',
            data: ret_files //返回data給前端預覽
        })
})

測試:

在「/public/upload/」下可以看到一個已經有一個以時間戳命名的檔案了

下載介面:

//下載介面
router.get('/download',async(req,res)=>{
    let file_name = req.query.file_name;
    let file_path = process.cwd()+'/public/upload/'+file_name;
    res.download(file_path);
})

完整程式碼:

uploadFile.js

const  express = require('express')//引入模組
const uploadFile = express()//範例化
const multer = require('multer')//引入範例化上傳檔案模組
const port = 8080 //埠

//組態檔上傳臨時目錄
const upload = multer({
    dest:'./public/upload/temp'//臨時存放路徑
})
//設定所有介面都允許上傳功能
uploadFile.use(upload.any())

//引入路由--接入其他介面
uploadFile.use('/route',require("./router/fileRouter"))//通過路由的方式將上傳和下載介面引入

//監聽
uploadFile.listen(port, () => {
    //監聽成功列印以下語句
    console.log(`Example app listening on port ${port}`)
})

 fileRouter.js:

const express = require("express");
const fs = require("fs");
var router = express.Router();


//post請求 寫個介面測試一下路由會不會報錯 
// router.post('/test',function(req,res){
//     // res.send(req.body)
//     res.send('ok')
// })

//寫上傳介面
router.post('/upload', (req, res) => {
    //檢查是否有檔案
    if (!req.files) {//如果req是空 返回400
        res.send({
            code: 400,
            msg: '上傳檔案不能為空',
        });
        return;
    }

        //儲存檔案
        let files = req.files; //將獲取的檔案放到files
        let ret_files = []; //定義一個空陣列
        for (let file of files) {//將files迴圈成單個
            //獲取名字字尾
            let file_ext = file.originalname.substring(file.originalname.lastIndexOf('.') + 1);
            //將檔名改為時間戳
            let file_name = new Date().getTime() + '.' + file_ext
            //移動檔案並且修改檔案名字
            fs.renameSync(
                process.cwd() + "/public/upload/temp/" + file.filename,//file.filename:檔案最初名字
                process.cwd() + "/public/upload/" + file_name, //file_name:時間戳新起的名字
            );
            //將改完的檔案寫進空陣列
            ret_files.push("./public/upload/" + file_name)
        }

        res.send({
            code: 200,
            msg: 'OK',
            data: ret_files //返回data給前端預覽
        })
})

//下載介面
router.get('/download',async(req,res)=>{
    let file_name = req.query.file_name;
    let file_path = process.cwd()+'/public/upload/'+file_name;
    res.download(file_path);
})


//3、把它加到模組上
module.exports = router;