You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从SQL数据库拉取PDF显示空白页问题求助

问题与解决方案

问题简述

从SQL表中读取PDF文件数据,期望在新窗口直接展示PDF而非触发下载。目前已成功获取数据,但打开PDF时仅显示正确页数,页面内容为空;部分文档仅第一页有内容,其余页面空白。

问题根源分析

  1. 后端冗余Base64转换:对SQL取出的二进制数据做Convert.ToBase64String再Convert.FromBase64String的无意义转换,会破坏二进制流完整性,导致PDF内容损坏。
  2. 响应头设置错误:Content-disposition: attachment会强制浏览器触发下载,既和展示需求冲突,也可能干扰Blob解析。
  3. 前端AJAX配置问题:jQuery中直接设置responseType无效,需通过xhrFields配置;同时AJAX转Blob属于冗余环节,增加出错概率。

修复后的代码

后端代码(VB.NET)

If IsDBNull(dt) = True Then Exit Sub

Dim filename As String = Trim(dt.Rows(0)("Name").ToString())
' 直接使用SQL中存储的二进制数据,移除冗余Base64转换
Dim fileBytes As Byte() = CType(dt.Rows(0)("Data"), Byte())

HttpContext.Current.Response.Clear()
HttpContext.Current.Response.AddHeader("Pragma", "public")
HttpContext.Current.Response.AddHeader("Cache-Control", "max-age=0")
' 改为inline,告知浏览器直接展示文件
HttpContext.Current.Response.AddHeader("Content-disposition", $"inline;filename={filename}")
HttpContext.Current.Response.ContentType = "application/pdf"
HttpContext.Current.Response.SuppressContent = False
HttpContext.Current.Response.AddHeader("Content-Length", fileBytes.Length.ToString())

Dim outputStream As Stream = HttpContext.Current.Response.OutputStream
outputStream.Write(fileBytes, 0, fileBytes.Length)
outputStream.Flush()
outputStream.Close()
HttpContext.Current.Response.End() ' 确保响应完整结束,避免多余输出

前端代码(简化可靠版)

无需AJAX,直接构造URL打开新窗口:

var ms = new Date();
var params = `action=DownloadFile2&ms=${ms.getTime()}&file_id=${file_id}`;
var url = urlPath + params;
window.open(url, '', "height=1000, width=2000");

若需保留AJAX逻辑(如前置校验),修复后的AJAX代码:

var ms = new Date();
var params = `action=DownloadFile2&ms=${ms.getTime()}&file_id=${file_id}`;
var url = urlPath + params;
$.ajax({
    type: "POST",
    url: url,
    xhrFields: {
        responseType: 'blob' // jQuery需通过xhrFields设置响应类型
    },
    success: function (data) {
        var fileURL = URL.createObjectURL(data);
        window.open(fileURL, '', "height=1000, width=2000");
        // 定时释放URL对象,避免内存泄漏
        setTimeout(() => URL.revokeObjectURL(fileURL), 10000);
    }
});

关键修复点说明

  • 移除冗余Base64转换:SQL存储的PDF是原生二进制流,直接使用即可,这是修复内容空白问题的核心。
  • 调整响应头:inline头让浏览器明确以展示模式处理PDF,而非强制下载。
  • 优化前端逻辑:直接打开接口URL减少中间环节;AJAX模式下修正responseType的配置方式,确保Blob正确生成。

内容的提问来源于stack exchange,提问作者jsmobis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 14:23:11