Content-Disposition inline在chrome中打开时无法下载PDF(ASP.NET)

dz6r00yl  于 2023-06-03  发布在  Go
关注(0)|答案(1)|浏览(756)
byte[] byteData= GetByteData(this.reportContent);
response.Clear();
response.ClearContent();
response.ClearHeaders();
 
response.Buffer = true;
response.AddHeader("Accept-Header", byteData.Length.ToString());
response.ContentType ="application/pdf";
response.Charset = "utf-8";
response.AddHeader("Accept-Ranges", "bytes");
string cd = $"inline;filename=myReport-123.pdf";
response.AddHeader("Content-Disposition", cd.ToString().Trim());
response.AddHeader("Content-Length", byteData.Length.ToString());
if (byteData.Length > 0)
    response.BinaryWrite(byteData);

response.Flush();
response.Close();

上面的代码不起作用,文件下载为Report.aspx而不是myReport-123.pdf我几乎尝试了所有方法,但没有工作。当我运行像localhost://........ report.aspx这样的应用程序时,它工作正常,但当我像我的IP https://192.168.1.1/...report.aspx一样打开时,它不工作。此问题仅在Chrome和IE上存在,而在Firefox中不存在。如果我传递MYFILENAME SHOULDNOTCHANGE.pdf,则fileName.pdf也将更改为report.aspx
我尝试添加response.AddHeader(“Content-Transfer-Encoding”,“Binary”);
我也尝试了其他可用的选择在互联网上,但无法得到所需的细节。
上面的代码不起作用,文件下载为Report.aspx而不是myReport-123.pdf我几乎尝试了所有方法,但没有工作。当我运行像localhost://........ report.aspx这样的应用程序时,它工作正常,但当我像我的IP https://192.168.1.1/...report.aspx一样打开时,它不工作。此问题仅在Chrome、IE和Edge上存在,Firefox中没有此问题。

fafcakar

fafcakar1#

首先,也是最重要的?
您发送到客户端的原始二进制数据流必须是100%完美的二进制格式的PDF文件,并且是Adobe PDF格式。
换句话说,您不能只是传输一个word文件,甚至一些简单的标记,并期望另一端通过某种神奇的方式将其转换为一个有效的PDF二进制文档,并将标记转换为一个符合Adobe PDF标准的文档。
因此,例如,此代码将发送/下载有效的PDF文件。

protected void cmdDownLoad_Click(object sender, EventArgs e)
    {

        string sFileWithPath = Server.MapPath(@"~/Content/CONTROL.pdf");

        if (File.Exists(sFileWithPath))
        {
            string sFileNameOnly = Path.GetFileName(sFileWithPath);
            string sMineType = MimeMapping.GetMimeMapping(sFileWithPath);
            FileInfo sFinfo = new FileInfo(sFileWithPath); // get lengh of file

            Response.Clear();
            Response.ContentType = sMineType;
            Response.AppendHeader("Content-Length", sFinfo.Length.ToString());

            Response.AppendHeader("Content-Disposition", "attachment; filename=" + sFileNameOnly);
            Response.TransmitFile(sFileWithPath);
            Response.End();

        }
    }

你没有显示,也没有解释你在哪里以及如何创建一个有效的PDF文件,你的源代码看起来是:

this.reportContent

那么,上面的PDF文档是否100%有效?
你不能只是发送相同的一些标记,但在你传输有问题的内容之前,该内容必须是一个正确的二进制格式的PDF文档。
现在,如果reportContent实际上是一个二进制PDF文档,而不是一些标记,那么理论上,上面使用的posted I代码应该可以工作。换句话说,您可以用二进制流替换PDF文档-一个有效的PDF,这也应该工作。
所以,上面可以说成这样:

string sFileWithPath = Server.MapPath(@"~/Content/CONTROL.pdf");
        string sMineType = MimeMapping.GetMimeMapping(sFileWithPath);
        byte[] pDFData = File.ReadAllBytes(sFileWithPath);

        string sFileNameOnly = Path.GetFileName(sFileWithPath);
        Response.Clear();
        Response.ContentType = sMineType;
        Response.AppendHeader("Content-Length", pDFData.Length.ToString());
        Response.AddHeader("Content-Disposition", $"attachment; filename={sFileNameOnly}");
        Response.BinaryWrite(pDFData);
        Response.Flush();
        Response.End();

同样,注意非常接近-结果输出必须是一个合法的和正确格式化的二进制PDF文件。
例如,您不能在这里发送一些HTML标记,您必须获取内容(this. reportContent),并在发送/传输reportContent中的任何内容之前转换为有效的PDF二进制文件格式。
换句话说,reportContent不能是标记-它必须是有效的二进制PDF格式字节流。
因此,作为测试,将此. reportContent的内容写入本地. pdf文件,并查看PDF查看器是否可以将该文件作为PDF打开。

编辑:测试是否有有效的PDF文件

所以,要测试你是否有一个有效的PDF,然后在你的开发机器上,尝试以下代码:

protected void Button2_Click(object sender, EventArgs e)
    {
       byte[] byteData= GetByteData(this.reportContent);

        string sTestFile = @"c:\test\test.pdf";

        File.WriteAllBytes(sTestFile, byteData);

    }

现在,在运行上述代码后,尝试使用PDF查看器打开test.pdf文件。文件是否正确打开?
所以,在你测试任何东西之前,尝试任何其他的道路或代码或方法?
您必须验证上述输出是100%有效的工作pdf文件。
那么,尝试上面的方法,你能用PDF查看器打开生成的PDF文件吗?

相关问题