上传文件:

很多人会使用第三包进行文件的上传,例如formidable。

我也研究过,可是与Express3.x框架一起使用时,发现上传的文件总是找不到。结果原因是下面这句导致:

app.use(express.bodyParser({'uploadDir:xxx'}));

Node端上传文件会将上传的文件临时保存到一个目录,然后再通过我们码的代码来移动文件到我们的指定目录;

因为Express3.x的默认上传临时目录和formidable的临时上传目录不一致,所以formidable一直找不到上传的文件。

另外formidable还有个BUG,可以参考https://cnodejs.org/topic/4f5c62932373009b5c0b027b

下面介绍不通过第三方包,express原生态的上传文件方式:

1.前台写法, 很简单,form表单提交。  注意input file控件的name属性,这个和后台会有关联。

<form action="后台路由" enctype="multipart/form-data" method="post">
<input type="file" name="upload" multiple="multiple"><br>
<input type="submit" value="Upload">
</form>

2.后台写法

app.post('/upload', function (req, res, next) {
//req.files即为上传文件对象,req.files.upload这里的upload即为你前台input file控件的name属性值
//获得上传文件的类型(各上传文件的类型请参考MIME)
var file_type = req.files.upload.type;
//判断上传类型,在此只能上传图片类型
if (file_type != "image/png" && file_type != "image/jpeg" && file_type != "image/bmp" &&
file_type != "image/gif") {
return res.jsonp({ success: 0, msg: 'FileType is Error' });
}
//临时文件路径
var tempPath = req.files.upload.path;
//临时路径也有了,下来就是通过fs进行文件的移动,重命名,以及删除临时文件的操作了。再次就不多写了
})

压缩与解压缩

压缩包模块:easy-zip2   解压缩包模块:unzip

当时找这个压缩包模块费了好大的劲,例如adm-zip等等,虽然星多,可是测下来或多或少都有问题。

直接上代码:

var easyzip = require('easy-zip2');
/**
* 压缩包(只能压缩文件夹)
* @param folder 压缩文件夹路径
* @param zipname 压缩包路径(带zip后缀)
* @param callback 回调
*/
var zip = function (folder, zipname, callback) {
callback = callback ? callback : function () {
};
var zip = new easyzip.EasyZip();
//添加压缩文件夹
zip.zipFolder(folder, function (err) {
if (err) return callback("Folder is not find", null);
//压缩文件
zip.writeToFile(zipname, function (err) {
if (err) return callback(err, null);
callback(null, 'ok');
});
});
}

上面我是压缩整个文件夹,当然也能压缩文件,具体的请自己去查找学习。

var unzips = require('unzip');
/**
* 解压缩包
* @param zipPath 压缩包路径
* @param unzipPath 解压路径
* @param callback 回调
*/
function unzip(zipPath, unzipPath, callback) {
callback = callback ? callback : function () {
};
//判断是否存在压缩包
fs.exists(zipPath, function (exists) {
if (!exists) return callback('zipPath is not esists', null);
//以流的方式进行解压缩
var unzipExtractor = unzips.Extract({ path: unzipPath });
//添加错误监听事件
unzipExtractor.on('error', function (err) {
callback(err, null);
});
//添加完成监听事件
unzipExtractor.on('close', function () {
callback(null, 'ok');
});
fs.createReadStream(zipPath)
.on('error', function (err) {
callback(err, null);
})
.pipe(unzipExtractor);
});
}

Http头

最近有个需求,需要在浏览器端下载zip文件。

于是就通过stream、pipe实现了此功能。

可是碰到了2个问题:

1.ie、firefox等浏览器下载的文件没有后缀名,下载下来后必须手动添加后缀。

2.下载的文件名错误,都是download,而不是实际我的压缩包文件。

经过大神提点,原来是要在返回的时候设置头部信息,指定文件的mime类型,以及文件名称才行。

下面以zip文件为例:

//设置mime类型
res.setHeader('Content-Type', 'application/zip');
//设置文件名
res.setHeader('Content-Disposition','attachment;filename=' + zipName + '.zip');
fs.createReadStream('xxx').pipe(res);

Node 文件上传,ZIP的更多相关文章

  1. node 文件上传

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  2. Node开发文件上传系统及向七牛云存储和亚马逊AWS S3的文件上传

    背景起,有奏乐: 有伟人曰:学习技能的最好途径莫过于理论与实践相结合. 初学Node这货时,每每读教程必会Fall asleep. 当真要开发系统时,顿觉精神百倍,即便踩坑无数也不失斗志. 因为同团队 ...

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

    node.js下四种post提交数据的方式 今天说分享的是其中一种,就是上传文件. Express 4.0 以后,将功能原子化,高内聚,低耦合,独立出了很多中间件 今天主要分享文件上传 对于conne ...

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

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

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

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

  6. php上传zip文件在线解压文件在指定目录下,CI框架版本

    我从网上找的文件php在线解压zip压缩文件 文件为jy.php可以直接执行,但是怎样将其加到CI框架中呢?? jy.php文件 <?php header("content-Type: ...

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

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

  8. node中间层实现文件上传

    一般情况下,前端的文件上传一般都是通过form表单的(<input type="file" />)来完成文件的上传,如果使用node中间层完成跨域,文件的上传就需要在n ...

  9. node.js使用express框架进行文件上传

    关于node.js使用express框架进行文件上传,主要来自于最近对Settings-Sync插件做的研究.目前的研究算是取得的比较好的进展.Settings-Sync中通过快捷键上传文件,其实主要 ...

随机推荐

  1. 使用C语言和i2c-dev驱动

    原文地址:blog.csdn.NET/wyt2013/article/details/20740659 感谢作者分享. 在本博客的<使用Beaglebone Black的I2C(一)>中, ...

  2. unity3d自动寻路教程

    U3D的自动寻路插件是不少,但是其实U3D的PRO版本就提供了相当实用的自动寻路组件了,以下教程分别讲解自动寻路的路径选择优先,上楼梯跳下的条件判断等等实用方法,教程分三编,但这个教程没有讲到Navm ...

  3. c#使用椭圆签名算法制作软件序列号

    椭圆曲线密码学(Elliptic curve cryptography,缩写为ECC)是基于椭圆曲线数学的一种公钥密码的方法.椭圆曲线在密码学中的使用是在1985年由Neal Koblitz和Vict ...

  4. 阿里云oss教程

    OSS是提供非结构化数据存取的服务.对于刚开始使用OSS的用户,非结构数据可以理解为word文档.PDF.PPT.EXCEL表格.MP3.MKV.RMVB.HTML等各种类型文件.OSS提供API去进 ...

  5. 嗅探X-Windows服务按键工具xspy

    嗅探X-Windows服务按键工具xspy   X-Windows完整名字是X Windows图形用户接口.它是一种计算机软件系统和网络协议.它为联网计算机提供了一个基础的图形用户界面(GUI)和丰富 ...

  6. Ubuntu 16.04下使用Wine安装Windows版的微信(不太完美)

    说明: 真的不太完美,别试了:除了需要安装额外的输入法之后,无法上传图片和间接性的BUG出现等等问题. 建议安装网页版的微信:http://www.cnblogs.com/EasonJim/p/711 ...

  7. Java基础教程:tutorialspoint-junit

    教程: 来自turorialspoint的JUnit教程(英文),官网:https://www.tutorialspoint.com/junit/index.htm 中文版本:http://wiki. ...

  8. 【bootstrap】使用支持bootstrap的时间插件daterangepicker

    其中的架包和代码,具体可以去GitHub下查看: https://github.com/AngelSXD/myagenorderdiscount 1.引入js和css <link href=&q ...

  9. android与服务器交互总结(json,post,xUtils,Volley)

    http://www.23code.com/tu-biao-chart/ 从无到有,从来没有接触过Json,以及与服务器的交互.然后慢慢的熟悉,了解了一点.把我学到的东西简单的做个总结,也做个记录,万 ...

  10. c++ 操作Mysql ado

    #pragma once #ifndef DB_MYSQL_H #define DB_MYSQL_H   #include "stdafx.h" #include <wins ...