heroku 如何在node.js Express应用程序中为用户给予下载窗口选项

mwg9r5ms  于 2022-11-13  发布在  Node.js
关注(0)|答案(1)|浏览(132)

我正在构建一个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上运行我的应用程序时,打开的新页面的URL为:
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抛出错误

错误代码:
是否无法找到临时文件?

hgqdbh6s

hgqdbh6s1#

第一个建议是如果你的代码不想保存太长时间,就不要再保存文件了。一个更好的方法是使用机器上的临时目录,让操作系统为你清理。你可以使用tempfile来生成一个临时文件的完整路径。
第二个建议是避免将文件生成和下载步骤分开。您可以res.download在服务器上使用www.example.com()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);
    });
});

相关问题