【问题标题】:Downloading a PDF from the internet results in partial file从 Internet 下载 PDF 会生成部分文件
【发布时间】:2014-09-08 15:52:48
【问题描述】:

我正在尝试使用以下代码从 Amazon S3 下载 pdf。但是,该文件仅部分下载并且无法打开。 (代码是其他 SO 答案和随机 Google 搜索的组合)。

byte[] buffer = new byte[32768];
long byteCount;
string filename = "random.pdf";

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(<url-to-s3>);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream resStream = response.GetResponseStream();

while ((byteCount = resStream.Read(buffer, 0, buffer.Length)) > 0)
{
    if (Response.IsClientConnected)
    {
        Response.ContentType = "application/pdf";
        Response.AddHeader("Content-Disposition", "attachment;filename=" + filename);
        Response.OutputStream.Write(buffer, 0, buffer.Length);
        Response.Flush();
        Response.Close();
        Response.End();
    }
}

【问题讨论】:

    标签: c# asp.net pdf download


    【解决方案1】:

    我假设文件大于 32k,在这种情况下,您将在读取所有字节之前刷新并关闭响应。此外,您应该只向客户端发送读取的字节(由byteCount 表示)而不是整个缓冲区。您也不需要设置Response.ContentType 并为每个缓冲操作添加重复的标头。试试:

    Response.ContentType = "application/pdf";
    Response.AddHeader("Content-Disposition", "attachment;filename=" + filename);
    
    while ((byteCount = resStream.Read(buffer, 0, buffer.Length)) > 0)
    {
        Response.OutputStream.Write(buffer, 0, byteCount);    
    }
    
    Response.Flush();
    Response.Close();
    Response.End();
    

    我还假设您没有收到错误本身 - 可能是因为 Response.End() 会断开客户端,所以 Response.IsClientConnected 返回 false。


    话虽如此,您应该可以只使用Stream.CopyTo 来复制流,而无需自己显式控制读-缓冲-写操作:

    Response.ContentType = "application/pdf";
    Response.AddHeader("Content-Disposition", "attachment;filename=" + filename);
    
    reStream.CopyTo(Response.OutputStream);
    
    Response.Flush();
    Response.Close();
    Response.End();
    

    如果要指定 32k 缓冲区,只需使用 Stream.CopyTo(Stream, int) overload

    reStream.CopyTo(Response.OutputStream, 32768);
    

    【讨论】:

    • 我没有使用 .NET 4.5,所以我不能使用 CopyTo()。
    • 另外,使用没有 CopyTo() 的代码,浏览器会在没有完成的情况下搅动(没有文件下载,没有导航到另一个页面)。
    • 你能调试它卡在哪里吗?
    猜你喜欢
    • 2020-11-14
    • 2012-05-29
    • 2022-11-02
    • 2013-07-30
    • 2011-04-04
    • 2021-07-13
    • 2020-07-05
    • 2015-10-01
    • 1970-01-01
    相关资源
    最近更新 更多