最近要做一个功能,导出动态生成的excel文件,这个普普通通的功能却让我折腾了半天。大致流程是这样的,将数据结合excel模板通过ejsExcel库,动态生成excel文件,并发送到客户端。

在express中有两个方法:res.sendFile()和res.download()都是用来发送文件的,但是这两个方法却只接收一个路径,不接收buffer。然而ejsExcel库返回的就是一个buffer。

糟糕的解决办法

不难想到,大不了就先用fs把buffer存成文件,然后再把路径交给res.download不就好了,这样做是可行,但是进行了多余的操作,把buffer存成文件,res.download方法不还是要将文件读成buffer再传输?

解决方法

cnode社区中有一个方法写到:

res.end(buff)

大喜过望之余,拿过去一试,妈蛋,浏览器接收到的是一个zip文件,没错,改一下后缀名excel就能打开,可是不能让用户去改后缀名吧,说好的ok呢。还差一步就是在服务器端就告诉浏览器这个文件的后缀名是啥,文件名是啥就好了。

content disposition

其实解决方法就在res.download()方法的实现中https://github.com/expressjs/express/blob/master/lib/response.js#L526

就是这个奇怪的header在起作用。告诉浏览器这个buffer姓甚名谁。于是加了两行代码:

res.set({
'Content-Disposition': `哈哈哈.xlsx`
})

所以一定要好好学http协议。

en,报错,不认中文。。。看来还是要用contentDisposition这个函数啊,把中文翻译成node不报错的字符串。本着负责任的态度,附上一个demo,防止让人空欢喜:

var express = require('express');

var contentDisposition = require('content-disposition');

var app = express();

var fs = require('fs');

app.get('/',function(req, res){
var buff = fs.readFileSync('./test.txt');
res.set('Content-Disposition', contentDisposition("这是一个excel.xlsx"))
res.end(buff)
})
app.listen(3000);

这个demo将一个txt文件buffer以xlsx的格式发出去。用浏览器访问localhost:3000就可以看到效果了。

express传输buffer文件的更多相关文章

  1. 基于RMI服务传输大文件的完整解决方案

    基于RMI服务传输大文件,分为上传和下载两种操作,需要注意的技术点主要有三方面,第一,RMI服务中传输的数据必须是可序列化的.第二,在传输大文件的过程中应该有进度提醒机制,对于大文件传输来说,这点很重 ...

  2. WCF 用netTcpbinding,basicHttpBinding 传输大文件

    问题:WCF如何传输大文件 方案:主要有几种绑定方式netTcpbinding,basicHttpBinding,wsHttpbinding,设置相关的传输max消息选项,服务端和客户端都要设置,tr ...

  3. linux传输大文件

    http://dreamway.blog.51cto.com/1281816/1151886 linux传输大文件

  4. 三、Socket之UDP异步传输文件-多文件传输和文件MD5校验

    本文接着上一篇文章二.Socket之UDP异步传输文件,在上一篇文章的基础上实现多文件的传输和文件传输完成后进行完整性校验. 要实现多文件的传输,必须要对文(2)中发送文件的数据格式进行改进,必须加入 ...

  5. C# 的 WCF文章 消息契约(Message Contract)在流(Stream )传输大文件中的应用

    我也遇到同样问题,所以抄下做MARK http://www.cnblogs.com/lmjq/archive/2011/07/19/2110319.html 刚做完一个binding为netTcpBi ...

  6. 使用QQ传输大文件

    现在在公网上能传输大文件并且稳定支持断点续传的软件非常少了,可以使用qq来做这件事. qq传输单个文件有时候提示不能超过4g有时候提示不能超过60g,没搞明白具体怎么样. 可以使用qq的传输文件夹功能 ...

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

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

  8. express返回html文件

    [express返回html文件] app.engine(ext, callback) 方法即可创建一个你自己的模板引擎.其中,ext 指的是文件扩展名.callback 是模板引擎的主函数,接受文件 ...

  9. 树莓派 Learning 002 装机后必要的操作 --- 10 实现本地电脑与远程桌面之间复制粘贴(传输)文件

    树莓派 装机后必要的操作 - 实现本地电脑与远程桌面之间复制粘贴(传输)文件 我的树莓派型号:Raspberry Pi 2 Model B V1.1 装机系统:NOOBS v1.9.2 PC端系统:w ...

随机推荐

  1. Vue组件基础用法

    前面的话 组件(Component)是Vue.js最强大的功能之一.组件可以扩展HTML元素,封装可重用的代码.根据项目需求,抽象出一些组件,每个组件里包含了展现.功能和样式.每个页面,根据自己所需, ...

  2. SpringMVC+MyBatis 事务管理二

    前言 上篇主要从编程式事务和声明式事务注解的形式来了解了事务,而这篇我们针对AOP的方式来实现事务.先回顾下事务的基础知识事务的隔离级别和事务的传播行为.使用aop 配置事务时注意引用aspectjw ...

  3. 阿里云直播SDK - .NET

    阿里云sdk:https://develop.aliyun.com/sdk/csharp?spm=5176.doc27234.2.4.QiJb9l Github:https://github.com/ ...

  4. BFS:noi6044鸣人与佐助

    PS:一道XX到我心态崩溃的好(傻逼)题. 先粘题目: 佐助被大蛇丸诱骗走了,鸣人在多少时间内能追上他呢? 已知一张地图(以二维矩阵的形式表示)以及佐助和鸣人的位置.地图上的每个位置都可以走到,只不过 ...

  5. sublime text3 配置使用

    前言 sublime text3 是一款优秀的代码编辑器,很多好用的功能让我成为其忠实用户. 流程 1.安装完成后首先配置package control,把下面的代码复制到sublime 的控制台: ...

  6. 在django中集成ckeditor富文本

    目前用的比较多的富文本插件有百度的ueditor.ckeditor.kindeditor等,其中ueditor和kindeditor比较美观,ckeditor的皮肤较少.但是ueditor加载较慢,k ...

  7. MySQL连接问题【mysql_connect和mysql_pconnect区别】

    --MySQL连接问题[mysql_connect和mysql_pconnect区别] -------------------------------------------------------- ...

  8. RMAN备份-未使用catalog-控制文件丢失

    情况描述 客户报告数据库故障,新来的系统管理员误操作.删掉了一些文件.具体情况是:删掉了所有重要数据文件.所有控制文件.数据库原来是归档模式,用rman备份数据,而rman 使用控制文件. 幸运的是, ...

  9. redis(1)

    什么是nosql 非关系型数据库 为什么要用nosql web2.0大规模动态网站的兴起 high performance ,高并发读写,动态页面展示与交互,比如微博点赞评论等操作,实时统计在线人数排 ...

  10. TestNG--入门介绍教程

    阅读目录 TestNG介绍 在Eclipse中在线安装TestNG 在Eclipse中离线安装Testng TestNG最简单的测试 TestNG的基本注释 TestNG中如何执行测试 使用testt ...