知行合一

node.js 文件下载

excel.js


var extend = require("extend");
var fs = require("fs");
var excelExport = require('excel-export');
var guid = require('guid');
var path = require('path');


/*function excel() {

this.req = null;
this.resp = null;
};*/

var excel = function () {
this.req = null;
this.resp = null;
};
/**
* 生成excel文件
* @param params
*/
excel.prototype.createExcel = function (params) {
var setting = {savePath: "uploadFile/excel/"};
setting = extend({}, setting, params);
var uuid = guid.create();
var data = params.data || "";
var result = excelExport.execute(data);
var name = 'excel' + uuid + '.xlsx';
var filePath = path.resolve(setting.savePath, name);
fs.writeFile(filePath, result, 'binary', function (err) {
setting.cb(filePath);
});
}
/**
* 计算上次的断点信息
* @param range
* @returns {number}
* @private
*/
excel.prototype._calStartPosition = function (range) {
var startPos = 0;
if (typeof range != 'undefined') {
var startPosMatch = /^bytes=([0-9]+)-$/.exec(range);
startPos = Number(startPosMatch[1]);
}
return startPos;
}
excel.prototype._configHeader = function (config) {
var startPos = config.startPos,
fileSize = config.fileSize,
resp = this.resp;
// 如果startPos为0,表示文件从0开始下载的,否则则表示是断点下载的。
if (startPos == 0) {
resp.setHeader('Accept-Range', 'bytes');
} else {
resp.setHeader('Content-Range', 'bytes ' + startPos + '-' + (fileSize - 1) + '/' + fileSize);
}
resp.writeHead(206, 'Partial Content', {
'Content-Type': 'application/octet-stream'
});
}
excel.prototype._init = function (filePath, down) {
var config = {};
var self = this;
fs.stat(filePath, function (error, state) {
if (error)
throw error;
config.fileSize = state.size;
var range = self.req.headers.range;
config.startPos = self._calStartPosition(range);
self.config = config;
self._configHeader(config);
down();
});
}
/**
* 下载文件
* @param filePath 文件路径
* @param req
* @param res
* @param isDeleted 下载完成后是否删除文件,true删除
*/
excel.prototype.download = function (filePath, req, res, isDeleted) {
var self = this;
self.req = req;
self.resp = res;
fs.exists(filePath, function (exist) {
if (exist) {
self._init(filePath, function () {
var config = self.config
resp = self.resp;
fReadStream = fs.createReadStream(filePath, {
encoding: 'binary',
bufferSize: 1024 * 1024,
start: config.startPos,
end: config.fileSize
});
fReadStream.on('data', function (chunk) {
resp.write(chunk, 'binary');
});
fReadStream.on('end', function () {
//是否删除文件
if (isDeleted) {
fs.unlink(filePath, function (err, res) {
});
}
resp.end();
});
});
}
else {
console.log('文件不存在!');
return;
}
});
}
module.exports = new excel();

 

调用:

 

/* app.get("/api/test6", function (req, res){
var conf = {};
conf.cols = [
{caption: 'string', type: 'string'},
{caption: 'date', type: 'string'},
{caption: 'bool', type: 'bool'},
{caption: 'number', type: 'number'},
{caption: "中国股票", type: 'number'}
];
conf.rows = [
['pi', '2015-06-29', true, 3.14],
["e", '2015-06-29', false, 2.7182],
["中国股票", '2015-06-29', false, 2.7182],
];
/!* var tables = { cols: [], rows: []};
for (var i = 0; i < header.length; ++i) {
tables.cols.push({caption: header[i], type: 'string'});
}*!/

数据的发送,服务器的处理

function () {

var table_head = this.table_view_model.col_headers;
var table_content = this.table_view_model.datas;
var columns = this.table_view_model.columns;
var table_data = {cols: [], rows: []};
for (var i = 0; i < table_head.length; ++i) {
table_data.cols.push({caption: table_head[i], type: 'string'});
}
for (var i = 0; i < table_content.length; ++i) {

table_data.rows.push([]);
table_data.rows[i] = [];
for (var j = 0; j < columns.length; ++j) {
table_data.rows[i].push(table_content[i][columns[j].data]);
}
}


var filename = "数据浏览器导出.xlsx";
var url = serverPathUrl + "api/test6";
var form = document.createElement("form");
form.action = url;
form.method = "post";
var opt;
opt = document.createElement("textarea");
opt.name = "content";
opt.value = JSON.stringify(table_data);
//opt.value = table_data;
form.appendChild(opt);
opt = document.createElement("textarea");
opt.name = "filename";
opt.value = filename;
form.appendChild(opt);
form.submit();
}

app.post("/api/test6", function(req, res) {

var filename = req.body.filename;
var tableContent=JSON.parse(req.body.content);
excel.createExcel({
//data: JSON.parse(req.body.content),
data: tableContent,
savePath: "uploadFile/excel/",
cb: function (path) {
res.setHeader('Content-Disposition', 'attachment; filename=' + encodeURIComponent(filename));
excel.download(path, req, res, true);
}
});
});

 

posted on 2018-08-23 17:16  哥德巴赫猜想  阅读(89)  评论(0)    收藏  举报

导航