node.js - AngularJS 强制 Firefox/Safari 下载文件而不是在浏览器中打开

标签 node.js angularjs azure firefox

我有一个 PDF 文件,可以在除 Firefox/Safari 之外的所有浏览器上下载。它在浏览器窗口中打开它,而不是下载文件。我的网站在 Node.js 之上运行并托管在 Azure 中。用户下载的文件来自 Azure blob 存储,因此我怀疑这可能是 CORS 问题。

这是我的下载客户端代码:

<a href="{{fileURL}}" class="btn btn-default" download="myfile.pdf">Download File</a>

这是服务器端代码:

$scope.fileURL = 'https://myblob.blob.core.windows.net/8282020/myfile.pdf';

更新:我可以根据下面的帮助通过在 Azure 中设置 blob 属性来添加内容配置,并且该配置将显示为“附件”,但在 FireFox/Safari 中它仍然是在浏览器中打开。由于 Azure Blob 存储可能被视为 CORS,这是否可能被阻止?

更新 2: 将以下内容添加到我的 HTML 标记中似乎可以在 FireFox 中使用(但不能在 Safari 中使用),这是跨浏览器处理此问题的正确方法吗

type="application/octet-stream"

更新 3: 通过 Node 设置内容处置和内容类型似乎有效。我想问一下,这样的方法对吗?

blobSvc.setBlobProperties(containerName, filename, { contentDisposition: 'attachment', contentType: 'application/octet-stream' }, function (error, result, response) {
// result code here....
})

最佳答案

通常,我们可以将 blob 的 Content-Disposition 设置为 attachment 来指示用户代理不应显示响应,而是显示“另存为”对话框文件名不是指定的 blob 名称。 您可以引用Set Blob Properties了解更多信息。

Can I set the disposition on initial upload? I am using Node/JavaScript: blobSvc.createBlockBlobFromLocalFile('mycontainer', 'myblob', 'test.txt', function(error, result, response){ if(!error){ // file uploaded } });

在我的测试中,我必须在 Azure 存储中创建 Blob 后setBlobProperties,才能成功设置 Blob 的Content-Disposition

EG

blobsrv.createBlockBlobFromLocalFile('mycontainer', 'Azure.pdf', 'upload/Azure.pdf', function (error, result, response) {

        if (error) res.send(500);
        blobsrv.setBlobProperties('mycontainer', 'Azure.pdf', { contentDisposition: 'attachment' }, function (error, result, response) {
            res.send(200, JSON.stringify(response));
        })
    });

在我的测试中,Angular 前端将下载该文件,而不是直接在 FireFox 浏览器中打开它。

<a href="{{pdfurl}}" download="Azure.pdf">Azure.pdf</a>
$scope.pdfurl = "http://<cantainer>.blob.core.windows.net/mycontainer/Azure.pdf";

关于node.js - AngularJS 强制 Firefox/Safari 下载文件而不是在浏览器中打开,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34364626/

相关文章:

javascript - 使用 Node.js 以编程方式启动和终止 Web 浏览器

javascript - 为什么 "message.channel.find"不是函数?

javascript - AngularJS - 从 openDatabase 获取数据

jquery - 使用 jQuery jslint 错误 : '$' is not defined

javascript - v2.canGoForward 不是函数

javascript - 为什么无法识别mssql对象?

javascript - 使用pm2时如何自动重新加载Node.js项目

javascript - 渲染页面后Mongojs查询完成

azure - 无法授予管理员同意。您的组织没有以下 API 的订阅(或服务主体): Power BI Service

c# - 使用 Azure CLI 在 Rider 中获取 Azure Key Vault 的访问 token