在客户端下载web api发送的字节数组为pdf

时间:2014-03-25 18:33:55

标签: jquery asp.net-mvc-4 asp.net-web-api download

我正在将水晶报告导出为pdf文档,并且在UI中有一个按钮,可以将该pdf下载到"下载"夹。为了实现这一点,我在web api中有一个方法,在按钮点击时执行,该方法返回HttpResponseMessage,其内容是字节数组(pdf驻留在blob上,我将该文件下载到字节数组)。 从UI,使用javascript的window.open方法我直接打开web api方法的URL,执行时将该文件下载到downloads文件夹中。

这很好用。但是现在我已经将[Authorize]属性添加到web api控制器中,因此当javascript窗口打开时会显示方法URL,系统会提示用户输入用户名和密码值。

我正在尝试将ajax请求发布到服务器上,该服务器在客户端上返回字节数组。执行ajax请求后,我编写了以下代码:

data = "data:application/octet-stream;base64," + data;
document.location = data;

该文件确实已下载,但会以下载"下载"我必须使用的文件"打开..."查看文件的选项。如何将其作为pdf文档下载?

1 个答案:

答案 0 :(得分:0)

如果您尝试使用WebApi提供文件,则可以执行以下操作:

 HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.OK);
 Stream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read, 4096, true);
 response.Content = new StreamContent(fileStream);
 response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
 response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
 response.Content.Headers.ContentDisposition.FileName = "myfilename.pdf";

  return response;

您不需要手动处理流,框架调用HttpResponseMessage.Dispose,它调用StreamContent.Dispose,调用FileStream.Dispose。