node.js下四种post提交数据的方式

今天说分享的是其中一种,就是上传文件.


Express 4.0 以后,将功能原子化,高内聚,低耦合,独立出了很多中间件


今天主要分享文件上传

对于connect-multiparty ,他是专门处理此类post数据相关的依赖包,也是博客之前使用的方式 github 官方地址: https://github.com/andrewrk/connect-multiparty

安装

npm install connect-multiparty

使用

var multipart = require('connect-multiparty');
var multipartMiddleware = multipart();

app.post('/formdata',multipartMiddleware, function (req, res) {
 console.log(req.body);
 res.send(req.body);
});

注意

  • form标签里做这样的标识 enctype="multipart/form-data"

Connect-Busboy 中间件实现上传

github官方地址:https://github.com/mscdex/connect-busboy

install

npm install connect-busboy

使用

node.js 启动页 var busboy = require('connect-busboy');

中间件配置

app.use(busboy({
    limits: {
        fileSize: 10 * 1024 * 1024 // 10MB
    }
}));

上传文件处

这里的代码有点bug ,已经修复,你可以忽略,直接看我的另外一篇博客 Connect-Busboy 上传文件

function upload(req, res, next) {
    req.busboy.on('file', function (fieldname, file, filename, encoding, mimetype) {
        var tmp_path=path.join(os.tmpDir(), path.basename(filename));
        file.pipe(fs.createWriteStream(tmp_path));
        file.on('end',function(){
            var uuid = tool.generateUUID();
            commfile.savePathFile(uuid, mimetype, tmp_path, true, function(err, fileBase64) {
                if (err) {
                    res.json({
                        success:false,
                        url:''
                    });
                }else{
                    res.json({
                        success: true,
                        url: '/file/' + uuid
                    });
                }
            });
        });
    });

    req.pipe(req.busboy);
    }

出自:node.js 在 Express4.0 框架使用 Connect-Busboy 实现文件上传

> ## 说明 >> req.busboy 会监听几个事件 * req.busboy.on('file',function(fieldname, file, filename, encoding, mimetype){ .....} *上传文件时监听此事件* * req.busboy.on('field',function(key, value, keyTruncated, valueTruncated){ .... } *监听form表单中非文件类型其他参数*

上面的上传示例只用到了处理文件类型的字段,没有涉及到非文件类型的字段.所以只监听了 file 事件.

req.busboy.on('file’, function (fieldname, file, filename, encoding, mimetype)

上面的事件会在 enctype="multipart/form-data" 的 form 表单post 提交数据时被监听

function(fieldname, file, filename, encoding, mimetype) 回调函数中是服务器获取到的文件相关处理信息 fieldname 是一个上传文件的标识 file 是上传的文件流句柄 filenname 是文件名(包含扩展名) encoding 是文件编码类型 mimetype 是文件mime类型 var tmp_path=path.join(os.tmpDir(), path.basename(filename)); 根据系统临时目录 和 文件名,来定位文件临时存放路径


os.tmpDir() 是当前系统临时目录,需要引用 require(‘os’); path.basename(filename) 是提取filename 路径中最后一个 / 之后的文件名,比如 /aa/bb/cc.jpg 此方法最后得到的是 cc.jpg ,需 require(‘path’)


file.pipe(fs.createWriteStream(tmp_path)); 根据上面的临时文件目录,把上传文件临时保存起来 ,这里用到了 流 的 pipe 它就像一个水管子能源源不断的把字节流传递给文件流,直到文件被写入成功为止 file.on('end’,function(){ …} 此事件是在 文件 被写入完成时触发的事件. 当文件被写入临时目录成功后,马上触发上面的事件,我在这里 调用 commfile.savePathFile 方法把文件读取并写入到了数据库

如果你的文件是直接存放在服务器指定目录,那么完全没必要指定临时目录,再去拷贝,直接一步到位,存放在指定上面目录即可

我之所以用这种方法,是因为我的图片文件全部保存在数据库中

如果此上传方法的入口开放给用户,请注意根据 filename 后缀名 及 mimetype 来判断文件类型,进行过滤

 

node.js 在 Express4.0 框架使用 Connect-Busboy 实现文件上传的更多相关文章

  1. Dreamer 3.0 支持json、xml、文件上传

    自己写的框架,功能类似Struts2.x 下载地址:http://pan.baidu.com/share/link?shareid=3273223286&uk=470382596 新增功能: ...

  2. 【Servlet3.0新特性】第03节_文件上传

    这是一个Web Project 首先是web.xml <?xml version="1.0" encoding="UTF-8"?> <web- ...

  3. 使用Node.js实现简易MVC框架

    在使用Node.js搭建静态资源服务器一文中我们完成了服务器对静态资源请求的处理,但并未涉及动态请求,目前还无法根据客户端发出的不同请求而返回个性化的内容.单靠静态资源岂能撑得起这些复杂的网站应用,本 ...

  4. Node.js新手教程——怎样实现文件上传功能

    作者:zhanhailiang 日期:2014-11-16 本文将介绍怎样使用Node.js实现文件上传功能. 1. 初始化项目信息:npm init [root@~/wade/nodejs/node ...

  5. node.js系列(实例):原生node.js+formidable模块实现简单的文件上传

    /** * 原生node.js结合formidable模块实现图片上传改名 * @Author:Ghost * @Date:2016/07/15 * @description: * 1.引入模块htt ...

  6. node应用通过multer模块实现文件上传

    multer用于处理文件上传的nodejs中间件,主要跟express框架搭配使用,只支持表单MIME编码为multipart/form-data类型的数据请求. 如果要处理其他编码的表单数据可以通过 ...

  7. AjaxUpLoad.js使用实现文件上传

    AjaxUpLoad.js的使用实现无刷新文件上传,如图. 图1 文件上传前 图2 文件上传后 1.创建页面并编写HTML [html] view plaincopy   上传文档: <div  ...

  8. JS组件系列——Bootstrap文件上传组件:bootstrap fileinput

    前言:之前的三篇介绍了下bootstrap table的一些常见用法,发现博主对这种扁平化的风格有点着迷了.前两天做一个excel导入的功能,前端使用原始的input type='file'这种标签, ...

  9. 艺萌文件上传下载及自动更新系统(基于networkComms开源TCP通信框架)

    1.艺萌文件上传下载及自动更新系统,基于Winform技术,采用CS架构,开发工具为vs2010,.net2.0版本(可以很容易升级为3.5和4.0版本)开发语言c#. 本系统主要帮助客户学习基于TC ...

随机推荐

  1. Struts2配置国际化资源

    1. 国际化的目标 1). 如何配置国际化资源文件 I. Action 范围资源文件: 在Action类文件所在的路径建立名为 ActionName_language_country.properti ...

  2. textarea关于空格和换行那点事

    textarea中空格连续输入多个的情况下,数据回显的时候页面只是显示一个:换行同样有问题,在textarea中有换行,在页面上却没有,今天终于看到个写的比较具体的文章,拿过来收藏下. 地址链接: h ...

  3. JAVA--网络编程(UDP)

    上午给大家简单介绍了一下TCP网络通信的知识,现在就为大家补充完整网络编程的知识,关于UDP的通信知识. UDP是一种不可靠的网络协议,那么还有什么使用价值或必要呢?其实不然,在有些情况下UDP协议可 ...

  4. maven总结5

    上篇文章中项目最终发布的release仓库和快照仓库都是nexus的默认仓库,若所有的本地开发项目版本都发布到同一个仓库,可能会造成冲突.因此,我们可以为每一个项目创建一组仓库(快照版本和releas ...

  5. 翻译qmake文档(三) Creating Project Files

    翻译qmake文档 目录   原英文文档:http://qt-project.org/doc/qt-5/qmake-project-files.html   创建项目文件 项目文件包含qmake构建你 ...

  6. 初识WCF

    以前,总是说自己的基础知识不牢靠,就是因为自己总是不总结.昨天,学费交了,顿时感觉不一样了,心里有劲也有力了,知道了以前的自己到底为什么会那样了,因为没有压力. --题记 我参加过浩哥的招标项目,参加 ...

  7. HDU 5690:2016&quot;百度之星&quot; - 初赛 All X

    原文链接:https://www.dreamwings.cn/hdu5690/2657.html All X Time Limit: 2000/1000 MS (Java/Others)    Mem ...

  8. bigworld源码分析(3)——dbMgr分析

    dbMgr主要是玩家数据的读取和保存的,例如在bigworld源码分析(3)中,玩家在认证的时候,loginApp需要通过dbMgr来验证玩家数据是否合法,这就是针对玩家的账号数据进行查询.本篇中,我 ...

  9. Python-Jenkins 查询job是否存在

    def check_jobs_from_jenkins(job_names): if isinstance(job_names, str): job_names = [job_names] job_d ...

  10. ok,今天讲讲linux的部分指令吧

    Linux布置服务  cd 进入   ../      上一层目录    sh shutdown.sh   -------tomcat的关闭指令  sh startup.sh       ------ ...