【问题标题】:Download byte array sent by web api as pdf on client在客户端以 pdf 格式下载 web api 发送的字节数组
【发布时间】:2023-03-29 09:00:02
【问题描述】:

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

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

我正在尝试向服务器发布一个 ajax 请求,该请求在客户端返回我的字节数组。 ajax请求执行后,我写了如下代码:

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

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

【问题讨论】:

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


    【解决方案1】:

    如果您尝试使用 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;
    

    不需要手动dispose流,框架调用HttpResponseMessage.Dispose,后者调用StreamContent.Dispose,后者调用FileStream.Dispose。

    【讨论】:

    • 我之前写过类似的代码,它工作得很好。但是我现在已经用 [Authorize] 属性装饰了我的 web api 控制器。这就是为什么我要从服务器向客户端发送 byte[]。您可以再次阅读问题。我想在客户端下载那个 byte[] 为 pdf 格式。
    猜你喜欢
    • 2011-10-11
    • 1970-01-01
    • 2018-08-30
    • 2018-04-25
    • 1970-01-01
    • 1970-01-01
    • 2012-05-14
    • 2015-04-06
    • 1970-01-01
    相关资源
    最近更新 更多