如何从 AJAX 请求下载附件?
How to download an attachment from an AJAX request?
我正在开发一个 Web 应用程序,它使用 .NET MVC 后端和 HTML,在前端使用 JavaScript 和 AJAX。
一个页面有一个功能,该页面对 .NET 控制器进行 AJAX 调用,然后 returns 一个 JSON 对象。基于这个对象的内容,浏览器下载一个 PDF 文件。这是为了让同一个 .NET 控制器有另一个方法 returns 一个流,然后 JavaScript 代码发出一个完整的页面请求(在这种情况下不是 AJAX 调用)该方法会导致浏览器提供查看或保存 PDF 文件的选项。
但是,这似乎是额外的工作,特别是因为当第一个 AJAX 调用 returns 时 PDF 文件已经可用。我可以轻松地将其内容转储到返回的 JSON 对象中,必要时以 Base64 编码。但我的问题是,在这种情况下,我如何才能在浏览器中触发下载?
在您的 ajax 回调中,创建一个 <a>
标签并将 href
属性设置为 base64 字符串,然后点击该标签。
.then((response) => {
var pdf = response.data;
if(!pdf) { return; }
var a = document.createElement("a");
a.href = `data:application/pdf;base64,${pdf}`;
a.download = "filename.pdf";
a.click();
})
虽然我会建议抽动你的控制器使其 return 直接将 Content-Type
设置为 application/pdf
的 pdf 文件,并用简单的 ajax 请求替换 JavaScript 类似 window.location="/api/pdf/username"
的语句
我正在开发一个 Web 应用程序,它使用 .NET MVC 后端和 HTML,在前端使用 JavaScript 和 AJAX。
一个页面有一个功能,该页面对 .NET 控制器进行 AJAX 调用,然后 returns 一个 JSON 对象。基于这个对象的内容,浏览器下载一个 PDF 文件。这是为了让同一个 .NET 控制器有另一个方法 returns 一个流,然后 JavaScript 代码发出一个完整的页面请求(在这种情况下不是 AJAX 调用)该方法会导致浏览器提供查看或保存 PDF 文件的选项。
但是,这似乎是额外的工作,特别是因为当第一个 AJAX 调用 returns 时 PDF 文件已经可用。我可以轻松地将其内容转储到返回的 JSON 对象中,必要时以 Base64 编码。但我的问题是,在这种情况下,我如何才能在浏览器中触发下载?
在您的 ajax 回调中,创建一个 <a>
标签并将 href
属性设置为 base64 字符串,然后点击该标签。
.then((response) => {
var pdf = response.data;
if(!pdf) { return; }
var a = document.createElement("a");
a.href = `data:application/pdf;base64,${pdf}`;
a.download = "filename.pdf";
a.click();
})
虽然我会建议抽动你的控制器使其 return 直接将 Content-Type
设置为 application/pdf
的 pdf 文件,并用简单的 ajax 请求替换 JavaScript 类似 window.location="/api/pdf/username"