随笔 - 42  文章 - 0 评论 - 2 阅读 - 11万
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

.net webapi后台返回pdf文件流,前端ajax请求下载,空白pdf排错经历

 

先上代码:

后台webapi代码:

[HttpGet]

[Route("{manifestId}")]
public IHttpActionResult FindManifestPdfById([FromUri]string manifestId)
{  

  byte[] result = _manifestService.GetData(manifestId);
  HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK);
  response.Content = new StreamContent(new MemoryStream(result));
  response.Content.Headers.Add("Access-Control-Expose-Headers", "Content-Disposition");
  response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/pdf");
  response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
  {
    FileName = manifestId + ".pdf",
  };
  return this.ResponseMessage(response);

}

 

前端代码:这边用的是angularjs,实现代码大同小异

function downloadFile(manifestUrl) {
  $http({
    url: manifestUrl,
    method: 'GET',
    responseType: "blob",
    params: {},
    headers: {
      'Content-Type': 'application/pdf',
    }
}).success(function (response, status, headers, config) {
  Export(response, 'abc.pdf');
}).error(function (response) {

});
}

//文件流下载
function Export(blob, fileName) {
  if ('download' in document.createElement('a')) { // 非IE下载
    var elink = document.createElement('a');
    elink.setAttribute("download", fileName);
    elink.style.display = 'none';
    elink.href = URL.createObjectURL(blob);
    document.body.appendChild(elink);
    elink.click();
    URL.revokeObjectURL(elink.href);// 释放URL 对象
    document.body.removeChild(elink);
  } else { // IE10+下载
    navigator.msSaveBlob(blob, fileName);
  }
}

 

这边最最最重要的一行代码是请求时添加responseType: "blob",参数。

之前没有添加:

通过返回的response组装blob

var blob = new Blob([data], {type: 'application/pdf'});

出来的标签死活是空白pdf,个人感觉是没有传responseType参数,服务器传回来的类型变成了字符串,再通过数组转成Blob时,编码就会异常,返回了空白pdf。

 

pdf流字符串显示形式

 

主要参考的文章有:

https://stackoverflow.com/questions/34436133/pdf-is-blank-when-downloading-using-javascript

https://stackoverflow.com/questions/12876000/how-to-build-pdf-file-from-binary-string-returned-from-a-web-service-using-javas/31763030#31763030

responseType说明

https://developer.mozilla.org/zh-CN/docs/Web/API/XMLHttpRequest/responseType

 
posted on   jeffh  阅读(3824)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示