我有一个非常简单的node.js应用程序,该应用程序成功处理了一个文件(来自强大格式),但结果文件下载失败。下载html
<p><input type="text" value = "tx-AllSerums.xlsx"><br>
<a href="/transformed/tx-AllSerums.xlsx"
download="All Serums.xlsx">Download transformed file</a>
</p>
结果文件从运行节点的位置写入目录结构(“转换后的目录”位于运行节点的目录中)。 当我单击上面的href时,我得到控制台输出,但没有文件保存对话框。 (服务器甚至应该收到此事件吗?) 当我杀死节点服务器时,向上弹出文件保存对话框。当然保存失败:网络错误。 我目前正在工作站上运行所有程序:Ubuntu 18.04; Chrome 70.0.3538.77,节点v10.13.0
我发现文件保存对话框确实出现了,但是单击后很长一段时间。但是服务器仍处于启动状态,并且保存操作仍然失败:网络错误。
将res.end()添加到捕获下载点击的块中,将立即弹出对话框。现在,我成功下载了一个零长度的文件。奇怪的是,我感到鼓舞。
var formidable = require('formidable');
var util = require("util");
var http = require('http');
var url = require('url');
var fs = require('fs');
var java = require("java");
var proc = require("process");
java.classpath.push("/home/u0138544/fake/prep-1.jar");
java.classpath.push("/home/u0138544/fake/SRTDependancies-1.jar");
console.log(proc.cwd());
http.createServer(function (req, res) {
txName = "";
if (req.url == '/fileupload' && req.method.toLowerCase() == 'post') {
var form = formidable.IncomingForm();
form.keepExtensions = true;
var excelFilePath;
var origName;
form.parse(req , function (err, fields, files) {
excelFilePath = files.filetoupload.path;
console.log("upload " + excelFilePath);
origName = files.filetoupload.name;
txName = "tx-" + origName.replace(/\s/g, "");
console.log( "txname = " + txName);
//just for formatter
var clz = "edu.utah.camplab.xlsx.SampleReportTransformer";
var tx = java.newInstanceSync(clz);
java.callMethodSync(tx, "run", excelFilePath, "./transformed/" + txName);
res.writeHead(200, {'Content-Type': 'text/html'});
res.write('<p>');
res.write('<input type="text" value = "' + txName +'"><br>');
res.write('<a href="transformed/' + txName + '" download="' + origName +'">Download transformed file</a></p>');
return res.end();
});
}
else if (req.url.includes('transformed') &&
req.method.toLowerCase() == 'get') {
console.log("download attribute doesn't work")
res.end();
}
else {
res.writeHead(200, {'Content-Type': 'text/html'});
res.write('<form action="fileupload" method="post" enctype="multipart/form-data">');
res.write('<input type="file" name="filetoupload" label="Pick a file"><br>');
res.write('<input type="submit">');
res.write('</form>');
return res.end();
}
}).listen(15080);