nodeJs实现文件上传,下载,删除

一.简介

     本文介绍了nodeJs+express框架下,用multer中间件实现文件的上传下载以及删除。

二.上传

     前端使用ElementUI的upload组件实现上传,代码如下:

    <el-upload
      class="upload-demo"
      action="http://localhost:9010/table/uploadFile"
      :on-preview="handlePreview"
      :on-remove="handleRemove"
      :before-remove="beforeRemove"
      multiple
      :limit="3"
      :on-exceed="handleExceed"
      :file-list="fileList" ref="elupload">
      <el-button size="small" type="primary">点击上传</el-button>
      <div slot="tip" class="el-upload__tip">只能上传jpg/png文件,且不超过500kb</div>
    </el-upload>

action定义后台接口的地址,后台代码如下:

var multer = require('multer');//引入multer
var upload = multer({dest: 'uploads/'});//设置上传文件存储地址
router.post('/uploadFile', upload.single('file'), (req, res, next) => {

    let ret = {};
    ret['code'] = 20000;
    var file = req.file;
    if (file) {
        var fileNameArr = file.originalname.split('.');
        var suffix = fileNameArr[fileNameArr.length - 1];
        //文件重命名
        fs.renameSync('./uploads/' + file.filename, `./uploads/${file.filename}.${suffix}`);
        file['newfilename'] = `${file.filename}.${suffix}`;
    }
    ret['file'] = file;
    res.send(ret);
})

定义好上传路径,选择好文件走后台方法时,文件已经下载到后端项目uploads文件夹。文件名是自动生成的uuid。代码需要做的是把文件的后缀加到上传的文件里。

这里是上传一个文件,所以用upload.single('file'),传入的参数是前台input type=file的name值。

multer详细API 在这里

三.下载

    后端代码:

router.use('/downloadFile', (req, res, next) => {
    var filename = req.query.filename;
    var oldname = req.query.oldname;
    var file = './uploads/' + filename;
    res.writeHead(200, {
        'Content-Type': 'application/octet-stream',//告诉浏览器这是一个二进制文件
        'Content-Disposition': 'attachment; filename=' + encodeURI(oldname),//告诉浏览器这是一个需要下载的文件
    });//设置响应头
    var readStream = fs.createReadStream(file);//得到文件输入流
    debugger
    readStream.on('data', (chunk) => {
        res.write(chunk, 'binary');//文档内容以二进制的格式写到response的输出流
    });
    readStream.on('end', () => {
        res.end();
    })
})

   前台传入文件名,后台拼出来文件下载的相对路径。根据路径得到文件输入流,并把内容以二进制格式写到response的输出流。读取结束后响应回浏览器。

前端代码

const downloadUrl = url => {
  let iframe = document.createElement('iframe');
  iframe.style.display = 'none'
  iframe.src = url
  iframe.onload = function () {
    document.body.removeChild(iframe)
  }
  document.body.appendChild(iframe)
};
module.exports=downloadUrl;

  创建一个工具方法,传入后台接口路径,执行下载。

dowloadUtil(`${process.env.BASE_API}/table/downloadFile?filename=${filename}&oldname=${oldname}`);

四.删除

fs.unlinkSync('./uploads/' + filename);

调用fs模块的unlinkSync方法,传入文件路径,直接删除。也可以用fs.unlink(callback)这个异步删除。

以下是基于nodejs express mongodb multer实现文件上传、存储、分页、管理功能的示例代码: 1.安装依赖 ```shell npm install express multer mongodb ``` 2.引入依赖 ```javascript const express = require('express'); const multer = require('multer'); const MongoClient = require('mongodb').MongoClient; const ObjectId = require('mongodb').ObjectId; const url = 'mongodb://localhost:27017'; const dbName = 'fileUpload'; const upload = multer({ dest: 'uploads/' }); const app = express(); ``` 3.连接数据库 ```javascript MongoClient.connect(url, { useNewUrlParser: true }, function(err, client) { if (err) throw err; console.log("Connected successfully to server"); const db = client.db(dbName); // ... }); ``` 4.上传文件 ```javascript app.post('/upload', upload.single('file'), function(req, res, next) { const file = req.file; const collection = db.collection('files'); collection.insertOne(file, function(err, result) { if (err) throw err; res.send('File uploaded successfully!'); }); }); ``` 5.获取文件列表 ```javascript app.get('/files', function(req, res, next) { const collection = db.collection('files'); const pageNum = parseInt(req.query.pageNum) || 1; const pageSize = parseInt(req.query.pageSize) || 10; const skip = (pageNum - 1) * pageSize; collection.find().skip(skip).limit(pageSize).toArray(function(err, docs) { if (err) throw err; res.send(docs); }); }); ``` 6.删除文件 ```javascript app.delete('/files/:id', function(req, res, next) { const collection = db.collection('files'); const id = req.params.id; collection.deleteOne({ _id: ObjectId(id) }, function(err, result) { if (err) throw err; res.send('File deleted successfully!'); }); }); ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值