gpt4 book ai didi

javascript - 如何在 Node.js Express 应用程序中向用户提供下载窗口选项

转载 作者:行者123 更新时间:2023-12-03 06:03:12 27 4
gpt4 key购买 nike

我正在构建一个 Node.js + Express 应用程序。我的服务器端创建了一个 excel 文件,我需要在下载窗口中将其提供给用户。这样用户就可以选择自己想要的目录然后下载。用户执行此操作后,我想删除该文件(该文件在应用程序的本地下载文件夹中创建)。

这是我的代码:

router.post('/filter', function(req, res){
try {
var root = path.dirname(require.main.filename);
var downloadsDir = root + '/downloads';
var workbook = new Excel.Workbook();

var worksheet = workbook.addWorksheet('My Sheet');
worksheet.columns = [
{ header: 'Id', key: 'id', width: 10 },
{ header: 'Name', key: 'name', width: 32 },
{ header: 'D.O.B.', key: 'DOB', width: 10 }
];
worksheet.addRow({id: 1, name: 'John Doe', dob: new Date(1970,1,1)});
worksheet.addRow({id: 2, name: 'Jane Doe', dob: new Date(1965,1,7)});

//ensure a download directory exist, if not then create it
fs.ensureDir(downloadsDir, function (err) {
console.log(err);
workbook.xlsx.writeFile(downloadsDir + '/temp.xlsx').then(function() {
console.log('file is written');
var file = downloadsDir + '/temp.xlsx';

// fs.emptyDir(downloadsDir + '/', function (err) {
// if (err) return console.error(err)
// console.log('success!')
// });
res.send(file);
});
});
} catch(err) {
console.log('OOOOOOO this is the error: ' + err);
}
});

此代码是从我的公共(public) javascript 上的 ajax 函数调用的

$('.filter-accounts-btn').click(function(){
$.ajax({
type: 'post',
url: '/accounts/filter',
success: function(data) {
console.log('------- data: ' + data);
window.open(data, '_blank');
},
error: function(err) {
console.log('------------ Error: ' + err);
}
});
});

但是它似乎不起作用。显然有什么问题。当我在 Heroku 上运行我的应用程序时,打开的新页面的网址为:

https://myapp.com/app/downloads/temp.xlsx

它向我显示错误。我还尝试使用名为 open 的 npm 模块我只是为用户打开 Excel。但这导致应用程序崩溃。

open(file, function (err) {
if ( err ) throw err;
});

在本地测试时,它会打开 Excel。

有更好的方法吗?另外,我如何知道用户是否已下载该文件?现在它保存在 downloads 文件夹中,但我想在用户下载文件后立即清空该文件夹(使用注释代码)。

**************** 编辑************************

根据建议,我尝试了这个新代码

workbook.xlsx.writeFile(tempfile('.xlsx')).then(function() {
console.log('file is written');
res.download(tempfile('.xlsx'), function(err){
console.log('---------- error downloading file: ' + err);
});
});

res.downlaod 抛出错误

enter image description here

Error: ENOENT, stat'/var/folders/nk/2w94bk3j5fs976d_dj5vwsvr0000gn/T/54f77d41-db1e-4dcf-8aea-7f88d682c436.xlsx'

是不是找不到临时文件?

最佳答案

第一个建议是,如果文件不打算持续很长时间,请停止将文件与代码一起存储。更好的方法是使用计算机的临时目录并让操作系统为您清理。您可以使用tempfile为了生成临时文件的完整路径。

第二个建议是避免分割文件生成和下载步骤。您可以使用res.download()服务器上的 api 指示浏览器直接向用户呈现下载窗口。也就是说:您不需要向浏览器发送下一步要下载的文件名,而是直接发送要下载的文件内容和一个特殊的 header 来指示客户端浏览器您希望客户端下载该文件。

后者要求您修改浏览器上的 Jquery(?,如果我错了请纠正我)代码。一旦发出 post 请求并收到服务器响应,浏览器应直接显示下载对话框。

试试这个:

var tmp = tempfile('.xlsx');
workbook.xlsx.writeFile(tmp).then(function() {
console.log('file is written');
res.download(tmp, function(err){
console.log('---------- error downloading file: ' + err);
});
});

关于javascript - 如何在 Node.js Express 应用程序中向用户提供下载窗口选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39667773/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com