Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在node.js express应用程序中为用户提供下载窗口选项_Javascript_Node.js_Excel_Express_Heroku - Fatal编程技术网

Javascript 如何在node.js express应用程序中为用户提供下载窗口选项

Javascript 如何在node.js express应用程序中为用户提供下载窗口选项,javascript,node.js,excel,express,heroku,Javascript,Node.js,Excel,Express,Heroku,我正在构建node.js+express应用程序。在我的服务器端创建一个excel文件,我需要在下载窗口中将其提供给用户。因此,用户可以选择他想要的目录,然后下载它。用户完成后,我想删除该文件(在应用程序的本地下载文件夹中创建) 这是我的密码: router.post('/filter', function(req, res){ try { var root = path.dirname(require.main.filename); var downlo

我正在构建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);
    }
});
这段代码是从我的公共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上运行我的应用程序时,打开的新页面有url:

它显示了我的错误。我还尝试使用一个名为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抛出了一个错误

错误:enoint,stat “/var/folders/nk/2w94bk3j5fs976d_dj5vwsvr0000gn/T/54f77d41-db1e-4dcf-8aea-7f88d682c436.xlsx”


找不到临时文件吗?

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

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

后者要求您修改浏览器上的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);
    });
});

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

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

后者要求您修改浏览器上的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);
    });
});

因此,通过使用tempfile,将为该文件生成一个临时路径。res.download()然后将此文件呈现给用户下载,然后OS(heroku?)将清除该路径。是这样吗?我已经删除了ajax并正在做一个表单发布。但是res.download给出了上面提到的错误(请参阅我问题中的编辑)。问题是每次调用tempfile时,它都会创建一个不同的临时文件路径。您需要调用它一次,并在整个请求处理过程中捕获结果。我用固定的代码更新我的答案,所以通过使用tempfile,将为该文件生成一个临时路径。res.download()然后将此文件呈现给用户下载,然后OS(heroku?)将清除该路径。是这样吗?我已经删除了ajax并正在做一个表单发布。但是res.download给出了上面提到的错误(请参阅我问题中的编辑)。问题是每次调用tempfile时,它都会创建一个不同的临时文件路径。您需要调用它一次,并在整个请求处理过程中捕获结果。我用固定代码更新我的答案