博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
express传输buffer文件
阅读量:5243 次
发布时间:2019-06-14

本文共 1216 字,大约阅读时间需要 4 分钟。

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

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

糟糕的解决办法

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

解决方法

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

res.end(buff)
1016471-20170915222442235-1531385331.png

大喜过望之余,拿过去一试,妈蛋,浏览器接收到的是一个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就可以看到效果了。

转载于:https://www.cnblogs.com/imgss/p/7528960.html

你可能感兴趣的文章
网站sqlserver提权操作
查看>>
PHP变量作用域以及地址引用问题
查看>>
实验四
查看>>
Elastic Stack-Elasticsearch使用介绍(三)
查看>>
MacOS copy图标shell脚本
查看>>
第八章 方法
查看>>
国外常见互联网盈利创新模式
查看>>
Oracle-05
查看>>
linux grep 搜索查找
查看>>
Not enough free disk space on disk '/boot'(转载)
查看>>
android 签名
查看>>
堆 栈
查看>>
Kth Smallest Element in Unsorted Array
查看>>
vue项目中使用百度统计
查看>>
android:scaleType属性
查看>>
SuperEPC
查看>>
RBAC用户角色权限设计方案
查看>>
thymeleaf
查看>>
CentOS7安装iptables防火墙
查看>>
mysql-5.7 innodb 的并行任务调度详解
查看>>