如何打开/查看/下载服务器返回的PDF文件。
我做了一些研究,但找不到任何可以适用于我的场景的东西。我在网格下有一个按钮打印,它将击中服务器,服务器将创建一个PDF文件并将其发回。
当我使用网址时
本地主机/总部/分支传输/下载重印文件/27500031/275
在浏览器地址栏上,我可以立即成功打开pdf文件。但是,当我单击按钮时不会。我收到一条警告消息,这是非常隐蔽的:
[WARN] 无法解析服务器返回的 JSON
这是我用于创建文件的 .Net 代码。
public Stream DownloadReprintFile(string transferId, string branchId)
{
string fileName = GetFullReprintFilePath(transferId, branchId);
if (!File.Exists(fileName))
{
Reprint(transferId, branchId);
}
WebOperationContext.Current.OutgoingResponse.ContentType = "application/pdf";
return File.OpenRead(fileName);
}
存储、代理和 JSON 读取器的代码
Ext.define('BranchTransferDashboard.store.PrintStore', {
extend: 'Ext.data.Store',
requires: [
'BranchTransferDashboard.model.PrintModel',
'Ext.data.proxy.Rest'
],
constructor: function(cfg) {
var me = this;
cfg = cfg || {};
me.callParent([Ext.apply({
storeId: 'PrintStore',
model: 'BranchTransferDashboard.model.PrintModel',
proxy: {
type: 'rest',
headers: {
Accept: 'application/pdf',
'Content-Type': 'application/pdf'
},
}
}, cfg)]);
}
});
打印按钮单击代码
console.log('Print Button Click');
var printStore = Ext.getStore('PrintStore');
var url = BranchTransferDashboard.globals.url + 'branchTransfer/downloadreprintfile/'+ this.activeRecord.transferId + '/' + this.activeRecord.sender;
printStore.proxy.url = url;
console.log(url);
printStore.load({
scope : this,
callback: function(records, operation, success) {
if (success){
}
}
});
我做过类似的事情,我使用iframe。我在 DOM 中隐藏了一个 iframe,当用户触发下载时,我将 iframe 的 src
属性设置为生成响应的服务。您还需要在服务器上设置Content-Disposition
标头。响应标头应如下所示:
Content-Disposition: attachment; filename="Report.pdf"
以下是 ExtJS 代码,它运行良好并弹出打开 PDF 文件。
//var printStore = Ext.getStore('PrintStore');
var url = MyApp.globals.url + 'myApp/downloadreprintfile/'+ this.activeRecord.transferId + '/' + this.activeRecord.sender;
//printStore.proxy.url = url;
var printPanel = Ext.create('Ext.form.Panel', {
title:'Print Panel',
id: 'printTabPanel',
standardSubmit: true,
layout: 'fit',
timeout: 120000
});
printPanel.submit({
target : '_new',
url : url
});
附言我的请求是 POST 请求。
服务器端
在服务器端生成报告后,应设置以下标头
headers.setContentType(MediaType.parseMediaType("application/pdf"));
headers.setContentDispositionFormData("inline", "Report.pdf");
客户端:以下代码用于使用 extjs 下载文件。将以下代码添加到方法中并调用此按钮操作.PDF将在新选项卡中打开。
如果要在新选项卡中打开文件为按钮操作调用以下代码。
/**
* open file in tab
*/
openReport: function () {
var url = 'downloadURL';
Ext.Ajax.request({
url: url,
method: 'GET',
autoAbort: false,
success: function(result) {
if(result.status == 204) {
Ext.Msg.alert('Empty Report', 'There is no data');
} else if(result.status == 200) {
var win = window.open('', '_blank');
win.location = url;
win.focus();
}
},
failure: function() {
//failure here will automatically
//log the user out as it should
}
});
}