【问题标题】:asp.net file downloadasp.net 文件下载
【发布时间】:2011-09-01 07:52:40
【问题描述】:

我想创建一个 asp.net 下载页面。我从数据服务接收文件作为字节数组。文件大小可达 10GB。所以我需要“分部分”传输文件。

这是我的代码:

Response.ContentType = "application/octet-stream"
Response.AddHeader("Content-Disposition", _
              "attachment; filename=" & HttpUtility.UrlEncode(file.Name))

Do
 If Not Response.IsClientConnected Then
    Exit Do
 End If

 result =ReadByte(offset,length) 'read next byte array

 Response.BinaryWrite(fresult.Data)
 Response.Flush()

Loop Until 'all bytes read

代码 sn-p 有效,但我有一个大问题。在用户确认浏览器下载对话框之前下载已经开始。如果用户等待 5 分钟,他已经下载了 10gb 的文件而没有接受它。

你有什么解决办法吗?

谢谢

【问题讨论】:

  • 据我所知,所有下载都是这样工作的。服务器不会等到确认按钮被按下(它会怎么告诉?)。它只是响应浏览器请求的内容。
  • 我同意 Oded 这是一个浏览器功能,以及为什么有时文件在您选择位置之前就已完成。那不是确认提示,当时他们已经被认为已经确认文件下载是他们想要做的事情。
  • 您必须强制下载过程将第一个字节块推送到浏览器,以便它提示用户确认...请参阅下面的代码..它适用于我的网络响应我想从 url 下载文件,你可以更新它以使其下载文件。

标签: asp.net vb.net iis


【解决方案1】:

此代码只需更新它以从文件中读取而不是网络响应

using (WebResponse fileDownloadResponse = fileToDownload.GetResponse())
            {
                using (Stream fileStream = fileDownloadResponse.GetResponseStream())
                {
                    using (StreamReader fileStreamReader = new StreamReader(fileStream))
                    {

                        context.Response.ContentType = "APPLICATION/OCTET-STREAM";



                        context.Response.AddHeader("Content-Length", fileDownloadResponse.ContentLength.ToString());

                        string fileName = Path.GetFileNameWithoutExtension(url);
                        string fileExtension = Path.GetExtension(fileUriBuilder.Uri.AbsolutePath);
                        context.Response.AddHeader("Content-Disposition", "attachment; filename="+fileName+fileExtension);

                        byte[] buffer = new byte[4096];

                        int byteseq = fileStream.Read(buffer, 0, 4096); while (byteseq > 0)
                        {

                            context.Response.OutputStream.Write(buffer, 0, byteseq);
                            context.Response.Flush();
                            byteseq = fileStream.Read(buffer, 0, 4096);

                        }

                    }
                }
            }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-24
    • 2011-02-25
    • 2010-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多