Node 文件上传,ZIP

上传文件:

很多人会使用第三包进行文件的上传,例如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);
时间: 2024-08-28 22:34:55

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

node 文件上传

<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title>向服务器上传文件</title> <script type="text/javascript"> function uploadFile(){ var formData=new FormData(); var files=do

Node.js上传文件

var formidable = require('formidable'); var util = require('util'); exports.upload = function(req,res){ var form = new formidable.IncomingForm(); form.encoding = 'utf-8'; form.uploadDir = "E:/file/upload";//目录需要已存在 /** * fields 表单中的其他属性 * files

Node.js入门教程——如何实现文件上传功能

作者:zhanhailiang 日期:2014-11-16 本文将介绍如何使用Node.js实现文件上传功能. 1. 初始化项目信息:npm init [root@~/wade/nodejs/nodejs-upload-image-demo]# npm init This utility will walk you through creating a package.json file. It only covers the most common items, and tries to gu

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

作者:zhanhailiang 日期:2014-11-16 本文将介绍怎样使用Node.js实现文件上传功能. 1. 初始化项目信息:npm init [root@~/wade/nodejs/nodejs-upload-image-demo]# npm init This utility will walk you through creating a package.json file. It only covers the most common items, and tries to gu

node+express实现文件上传功能

在进行node web开发时,我们可能经常遇到上传文件的问题,这一块如果我们没有经验,可能会遇到很多坑,下面我将跟大家分享一下,实现文件上传的一些方式. 一.node+express文件上传的常用方式 通过一段时间的查阅资料.摸索,我发现实现上传的方式有:1.express中间件multer模块(此效率最高,在express3.x原生支持,到了express4.x独立成一个模块了),2.connect-multiparty模块(但现在官方不推荐),3.使用multiparty模块实现(此方法比较

node中间层实现文件上传

一般情况下,前端的文件上传一般都是通过form表单的(<input type="file" />)来完成文件的上传,如果使用node中间层完成跨域,文件的上传就需要在node中间层处理成可读流,转成formData完成转发. 一.form表单文件上传 这是最常见的文件上传方式,通过form表单实现,简单实用,设置一下method.enctype.action属性就可以了,多文件上传需要设置multiple属性(部分浏览器支持还是有些问题的). 1 <form meth

Node.js文件上传

Node.js express使用Multer实现文件上传html部分 <div> <h3>文件上传:</h3> 选择一个文件上传: <br/> <form action="/upload" method="post" enctype="multipart/form-data"> <input type="file" name="content&quo

上传 Zip 压缩档并即时解压缩文件保存到 Blob

Upload Zip file and unpack on the fly to Windows Azure Blob Upload Zip file and unpack on the fly to Windows Azure Blob 为求方便(懒惰的做法XD),我直接借用小朱在 边做边学 Windows Azure 应用程序开发基础 Part 2:开发 BLOB.Table 与 Queue 应用程序 一文中的例子来改写. 如图中红色框框:其中最大的不同是使用 DotNetZip 这个组件以

node express formidable 文件上传后修改文件名

//我是用php的思想来学习nodejs var express = require('express'); var router = express.Router(); var fs = require('fs'); var path= require("path"); var formidable = require('formidable'); /* GET home page. */ router.get('/', function(req, res, next) { res.