我的页面上有一个链接,单击该链接后,我试图生成PDF文档,然后在浏览器上显示“打开-保存”提示。
我的HTML(reactjs组件)包含以下代码,其中onclick
调用_getMyDocument
函数,然后_getMyDocument
函数调用Webapi方法。
<div className="row">
<a href="#" onClick={this._getMyDocument.bind(this)}>Test Link</a>
</div>
_getMyDocument(e) {
GetMyDocument(this.props.mydata).then(()=> {
}).catch(error=> {
});
我的控制器具有以下代码
[HttpPost]
[Route("Generate/Report")]
public IHttpActionResult GetMyReport(MyData myData)
{
byte[] myDoc = MyBusinessObject.GenerateMyReport(myData);
var result = new HttpResponseMessage(HttpStatusCode.OK)
{
Content = new ByteArrayContent(myDoc)
};
result.Content.Headers.ContentDisposition =
new ContentDispositionHeaderValue("attachment")
{
FileName = "MyDocument.pdf"
};
result.Content.Headers.ContentType =
new MediaTypeHeaderValue("application/octet-stream");
var response = ResponseMessage(result);
return response;
}
现在所有的代码都执行了,但是我没有得到PDF文件下载的提示。我在这里做错了什么?
成功时从 AJAX 调用lokks的响应对象,如下所示
5条答案
按热度按时间6kkfgxo01#
您从服务器得到的响应看起来不错。缺少的部分是您没有以正确的方式处理来自客户端的响应。
让我们假设你的资源url对象看起来像下面的js.(即你已经知道资源url,如果你还不知道,那么你将需要一个单独的调用服务器知道下载url)
你要做的就是,
这将导致浏览器向服务器请求资源,服务器的响应必须包括
Content-Disposition:attachment;
。这将导致浏览器显示下载对话框。我最近做了一个类似的功能。如果你有问题请问。
当您希望强制浏览器显示某些文件(或资源)的下载提示时,必须在响应头中包含
Content-Disposition:attachment;
(您已经这样做了)。4urapxun2#
一个简单的方法是在服务器上使用GET方法,通过查询参数接收数据。
然后,在客户端应用中,您只需创建一个经典链接:
或者,如果您希望从脚本逻辑管理它,则使用简单JS脚本:
jw5wzhpr3#
在我们的应用程序(angular)中,我们必须使用如下代码创建一个对象URL:
网络API:
浏览器:
hk8txs484#
创建内容处置并将其添加到回复标头中
2sbarzqh5#
您的问题是GetMyDocument函数将接收PDF文件作为服务器响应,而当前您没有对该响应执行任何操作。您需要在then回调中处理该响应。从javascript保存文件并不完全简单,因此我建议使用外部库(如filesaver.js)来帮助您。
它最终会看起来像...