2014-03-25 19 views
1

我正在将Crystal报表导出到pdf文档,UI中有一个按钮用于在“Downloads”文件夹下载该pdf。为了达到这个目的,我在web api中有一个方法,通过单击按钮执行,并且该方法返回内容为字节数组的HttpResponseMessage(pdf位于blob上,并将该文件下载到字节数组中)。 从UI,使用javascript的window.open方法我直接打开web api方法的URL,当执行的时候在下载文件夹中下载文件。在web客户端下载pdf格式的字节数组作为pdf在客户端

这工作正常。但是现在我已经向web api控制器添加了[Authorize]属性,因此当javascript窗口打开时,会提示用户输入用户名和密码值。

我想发布一个ajax请求到服务器,它返回客户端上的字节数组。执行Ajax请求后,我写了下面的代码:

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

该文件确会下载,但它会下载为我必须使用“下载”文件“打开方式...”选项查看文件。我如何将它作为pdf文档下载?

回答

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。

+0

我以前写过类似的代码,它工作得很好。但我现在用[Authorize]属性装饰了我的web api控制器。这就是为什么我从服务器发送byte []到客户端。您可以再次阅读该问题。我想在客户端上以pdf格式下载该字节[]。 – user2585299