Node.js实现文件上传下载

1. 安装 express, multer库

npm install express multer

2. upload.js

import multer from 'multer';
import path from 'path';

// 设置 multer 存储配置
const storage = multer.diskStorage({
    destination: (req, file, cb) => {
        cb(null, 'uploads/'); // 上传的目录,如果不存在会报错
    },
    filename: (req, file, cb) => {
        cb(null, Date.now() + path.extname(file.originalname)); // 用时间重命名文件
    }
});

// 创建 multer 实例
const upload = multer({ storage: storage });

//异步方法 (可选)
async function uploadFile(req, res) {
    return await new Promise((resolve, reject) => {
        upload.single('file')(req, res, (err) => {
            if (err) {
                reject(err);
            } else {
                resolve('文件上传成功!');
            }
        });
    });
}

export default upload
export { uploadFile }

3. index,js

import express from 'express';
import path from 'path';

import { fileURLToPath } from 'url';
// 获取当前文件的目录 ES6的写法,如果是CommonJS,可以直接使用__filename和__dirname
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);

import upload, {uploadFile} from './upload.js'

const app = express();
const port = 3000;

app.use(express.json())

//这里分别展示同步和异步处理,像文件上传这种可能比较耗时的操作,建议用异步,这样不会造成服务器阻塞

// 异步处理上传请求
app.post('/upload', (req, res) => {
  uploadFile(req, res).then((data) => {
    res.json({ success: true, message: data });
  }).catch((err) => {
    res.status(500).json({ success: false, message: err.message });
  });
});


//同步处理上传请求
/*
app.post('/upload', upload.single('file'), (req, res) => {
  res.json({ success: true, message: '文件上传成功!' });
});
*/

app.get('/download/:filename', (req, res) => {
  const file = path.join(__dirname, 'uploads', req.params.filename); // 指定下载文件的路径
  console.info(file);
  res.download(file, err => {
      console.info(err);
      if (err) {
          res.status(404).send('文件未找到!');
      }
  });
});


app.listen(port, () => {
  console.log(`Server listening at http://localhost:${port}`);
});

4. 前端页面upload.html

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>文件上传</title>
</head>
<body>
    <h1>上传文件</h1>
    <form action="http://localhost:3000/upload" method="POST" enctype="multipart/form-data">
        <input type="file" name="file" required>
        <button type="submit">上传</button>
    </form>
</body>
</html>

5.运行服务器

node index.js

7. 运行前端页面执行上传

8. 下载用浏览器访问:

http://localhost:3000/download/{想下载的文件名}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值