从网站下载后无法在adobe中打开PDF文件,但可以在Edge中打开

时间:2017-03-16 15:59:21

标签: c# sql pdf adobe corrupt

我有一个运行aspx的网络应用程序,它有点像遗留应用程序。在提交期间,用户将支持文档(通常是转换为pdf的图片)上传到我们的sql server,在那里它们作为二进制文件存储,并且可以在批准期间的不同时间再次下载。

然而,我们刚刚开始遇到一个问题,我们的用户无法在adobe中打开pdf并得到可怕的“文件已损坏且无法修复”。错误信息。它们仍然可以在MS Edge中打开,因此它们实际上并未损坏。我已经确认pdf可以在上传前正常打开。

HttpPostedFile file = this.attachmentUploader.PostedFile;
if (file == null)
{
    file = Session["postedFile"] as HttpPostedFile;
}

if (file != null)
{
    var fileName = this.attachmentUploader.FileName;
    fileName = fileName.Length >= 100 ? string.Concat(fileName.Substring(0, 50).Trim(), ".pdf") : fileName;
    Attachment attachment = new Attachment()
    {
        FileName = fileName,
        File = this.attachmentUploader.FileBytes
    };

    db.Attachments.Add(attachment);
    db.SaveChanges();
}

这是下载代码

byte[] file = null;
// Code here to pull file from db
if (file != null)
{
    Response.Buffer = true;
    Response.ContentType = "application/pdf";
    Response.AddHeader("Content-Disposition",     "attachment;filename=support_doc.pdf");
    Response.OutputStream.Write(file, 0, file.Length);
}

任何帮助表示赞赏!

1 个答案:

答案 0 :(得分:0)

下载的文件实际上包含两个连接文件,即实际PDF和HTML文件。

HTML文件的大小接近70 KB,如果没有外部JavaScript和图像,它看起来像这样:

[---出于隐私原因删除图片---]

我假设在您的“下载代码”之后,其他一些代码会将此HTML添加到输出中。

您可能希望搜索该代码,或者您可能只想关闭Response.OutputStream并在Response.OutputStream.Write(file, 0, file.Length)之后立即完成回复。

根据PDF规范,PDF处理器必须从其末端开始读取PDF,其中存在交叉引用信息,但就文件而言,就PDF语法而言,有近70 KB的垃圾。

因此,任何PDF查看器都可以拒绝该文件为无效。