上传

Node.js 上传文件免费看

Formidable模块安装、Formidable模块的使用、使用Formidable模块实现上传文件

2020-04-17侠课岛    基础入门       

后端/Node.js/Node.js简明入门 7     0     684

我们在实际开发中,可能经常会遇到文件上传功能。我们可以选择使用 express 框架实现文件上传,但是 express 框架在4.0版本后就不支持 req.files 接收上传文件。对于文件上传,需要加 multipart 格式数据处理的中间件。multipart 数据处理中间件有:busboy、multer、formidable、multiparty、connect-multiparty、pez等。

Node.js 中提供了一个非常好的用于文件上传的模块,也就是 Formidable模块。这个模块可以用于处理文件、图片、视频等数据上传,支持GB级上传数据处理,支持多种客户端数据提交。有极高的测试覆盖率,非常适合在生产环境中使用。

Formidable模块安装

Formidable 是一个轻量级的应用包,可以用来处理post请求,甚至可以处理图片、zip文件等的上传。Formidable 可以不依赖于 express 等框架单独使用,也可以集成到 exress 框架中使用。 我们可以选择使用NPM命令来下载和安装 Formidable 模块,命令如下所示:

npm install formidable

或者也可以使用yarn命令安装:

yarn add formidable

如果安装速度比较慢,也可以使用淘宝镜像安装:

cnpm install --save formidable

成功安装 Formidable 模块之后,可以在任意文件中引入这个模块并使用了:

var formidable = require('formidable');

Formidable模块的使用

  • 创建Formidable.IncomingForm对象:
    var form = new formidable.IncomingForm()
  • 设置表单域的编码:
    form.encoding = 'utf-8'
  • 设置上传文件存放的文件夹,默认为系统的临时文件夹:
    form.uploadDir = "/my/dir"
  • 设置只读:
    form.type
  • 保持上传文件的原扩展名:
    form.keepExtensions = true
  • 设置上传文件的检验码:
    form.hash = false
  • form.bytesReceived:返回服务器已经接收到当前表单数据多少字节:
  • form.bytesExpected:返回将要接收到当前表单所有数据的大小。
  • form.parse(request, [callback]):会转换请求中所包含的表单数据,callback会包含所有字段域和文件信息。
    form.parse(req, function(err, fields, files) {
    // ...   
    });
  • form.onPart(part):可以重载处理multipart流的方法,这样做的话会禁止field和file事件的发生,你将不得不自己处理这些事情。
    form.onPart = function(part) {
    part.addListener('data', function() {
        // ...
    });
    }

使用Formidable模块实现上传文件

例如我们创建一个 Node.js 文件,在文件中编写带有上传字段的 HTML 表单:

var http = require('http');

http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/html'});
  res.write('<form action="fileupload" method="post" enctype="multipart/form-data">');
  res.write('<input type="file" name="filetoupload"><br>');
  res.write('<input type="submit">');
  res.write('</form>');
  return res.end();
}).listen(8888);

引入Formidable模块,以便在上传的文件到达服务器后能够对其进行解析。

var http = require('http');
var formidable = require('formidable');

http.createServer(function (req, res) {
  if (req.url == '/fileupload') {
    // 处理上传的文件 
    var form = new formidable.IncomingForm();

    form.parse(req, function (err, fields, files) {
      res.write('文件上传');
      res.end();
    });
  } else {
    res.writeHead(200, {'Content-Type': 'text/html'});
    res.write('<form action="fileupload" method="post" enctype="multipart/form-data">');
    res.write('<input type="file" name="filetoupload"><br>');
    res.write('<input type="submit">');
    res.write('</form>');
    return res.end();
  }
}).listen(8888);

将文件成功上传到服务器后,它将放置在一个临时文件夹中。该目录的路径可以在“文件”对象中找到,该对象作为parse()方法的回调函数中的第三个参数传递。

var http = require('http');
var formidable = require('formidable');
var fs = require('fs');

http.createServer(function (req, res) {
  if (req.url == '/fileupload') {
    // 处理上传的文件 
    var form = new formidable.IncomingForm();

    form.parse(req, function (err, fields, files) {
      var oldpath = files.filetoupload.path;
      var newpath = 'C:/Users/lu/Desktop/Node_web' + files.filetoupload.name;
      fs.rename(oldpath, newpath, function (err) {
        if (err) throw err;
        res.write('文件上传和移动');
        res.end();
      });
 });
  } else {
    res.writeHead(200, {'Content-Type': 'text/html'});
    res.write('<form action="fileupload" method="post" enctype="multipart/form-data">');
    res.write('<input type="file" name="filetoupload"><br>');
    res.write('<input type="submit">');
    res.write('</form>');
    return res.end();
  }
}).listen(8888);

启动文件,访问http://127.0.0.1:8888/,选择需要上传的文件,点击提交按钮,然后页面会跳转到http://127.0.0.1:8888/fileupload中,显示如下所示:

文件上传和移动

本教程图文或视频等内容版权归侠课岛所有,任何机构、媒体、网站或个人未经本网协议授权不得转载、转贴或以其他方式复制发布或发表。

评价

7

本课评分:
  •     非常好
难易程度:
  •     适中的

内容目录


本文索引


|
教程
粉丝
主页

签到有礼

已签到2天,连续签到7天即可领取7天全站VIP

  • 1
    +2 金币
  • 2
    +3 金币
  • 3
    +5 金币
  • 6
    +7 金币
  • 5
    +6 金币
  • 4
    暖心福利
    自选分类VIP ×1天
  • 7
    惊喜大礼

    自选分类VIP ×3天 +20金币
  • 持续签到 +8 金币

金币可以用来做什么?