我在Java中使用我的REST服务,它有一个端点,可以将文件发送到客户端(HTTP GET,/ file)。我的前端客户端在NodeJS中。我无法从REST服务下载该文件。我只能将文件存储在特定位置,但我想有一个下载对话框,用户可以在其中存储文件(就像任何其他下载对话框一样)。我的NodeJS代码如下:
router.get('/openFile',function(req,res){
native_data_retrieval_rest_client.get("http://localhost:8080/file?fileName=presentation.pcap",function(data){
var fileName="/home/files/presentation.pcap";
res.download(data);//This doesnt open dialogue box
fs.writeFile(fileName, data, function (err) {
if (err) {
//Error handling
} else {
console.log('Done');
}
});
});
});
该文件静态保存在/home/files/presentation.pcap
位置。
我的REST服务端响应如下:
response.setHeader("Content-Disposition", "attachment; filename="
+ fileName);
response.setHeader("Content-Type", type);
reportBytes = new byte[131072];// New change
OutputStream os = response.getOutputStream();// New change
int read = 0;
while ((read = inputStream.read(reportBytes)) != -1) {
os.write(reportBytes, 0, read);
}
//System.out.println("Bytes sent" + reportBytes);
os.flush();
os.close();
我在NodeJS端获得的结果就像一个包含文件内容的警告框。见下面的输出:
任何人都可以让我知道我在这里做的错误。我想在用户点击“下载”按钮时有下载对话框。单击下载按钮时,呼叫应转到REST服务,然后REST服务将文件发送到NodeJS前端,并打开一个对话框,询问用户该位置。
来自HTML的我的电话如下
tr.append("td").append("button")
.on("click", function(){
openFile();
})
function openFile(){
alert("button clicked");
$http.get('/openFile/').success(function(response) {
console.log(response.response);
}).error(function(error){
alert(error);
});
}
答案 0 :(得分:3)
res.download()不接受数据。它需要一个文件路径。
http://expressjs.com/en/api.html#res.download
您想在成功的fs.writeFile回调中调用res.download
var fileName = "presentation.pcap";
var filePath = "/home/files/" + fileName;
fs.writeFile(filePath, data, function (err) {
if (err) {
//Error handling
} else {
console.log('Done');
res.download(filePath, fileName, function(err) {
console.log('download callback called');
if( err ) {
console.log('something went wrong');
}
}); // pass in the path to the newly created file
}
});
<强>更新强>
如果您使用的是ajax请求,则无法以这种方式下载文件。浏览器使得无法通过ajax请求进行下载。
您要做的只是使用网址在锚元素中下载文件。
<强> HTML 强>
<a class="button" href="http://localhost:3000/openFile" target="_blank">Get request</a>
如果您需要使用javascript进行预测,可以使用window.open()方法。
<强>的Javascript 强>
$('.button').click(function(e) {
e.preventDefault();
window.open('http://localhost:3000/openFile', '_blank');
});
我在这个例子中使用了jQuery,但我认为它说明了需要做什么。 window.open部分是重要的部分。