• 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);
  • 相关阅读:
    19年春第六周学习
    Java编程思想
    个人作业4-结对开发地铁
    Hadoop学习笔记—1.基本介绍与环境配置
    ZooKeeper学习第二期--ZooKeeper安装配置
    ZooKeeper学习第一期---Zookeeper简单介绍
    loadrunner--参数化—使用数据文件参数化
    loadrunner--analysis--图表筛选、合并、显示
    loadrunner--并发测试
    session和cookie
  • 原文地址:https://www.cnblogs.com/showtime813/p/4618517.html
Copyright © 2020-2023  润新知