您现在的位置是:首页 >

单个文件过大无法复制 Response.WriteFile无法下载大文件

火烧 2021-05-15 07:38:23 1043
Re o e.WriteFile无法下载大文件 当您尝试使用 re o e writefile 方法下载大文件时 下载操作可能没有响应 并且随后可能会收到以下错误信息之一 The age ca ot

Response.WriteFile无法下载大文件  

单个文件过大无法复制 Response.WriteFile无法下载大文件
当您尝试使用 response writefile 方法下载大文件时 下载操作可能没有响应 并且随后可能会收到以下错误信息之一 The page cannot be displayed 或 Server Application UnavailableThe Web application you are attempting to access on this Web server is currently unavailable Please hit the Refresh button in your Web browser to retry your request Administrator Note:An error message detailing the cause of this specific request failure can be found in the system event log of the web server Please review this log entry to discover what caused this error to occur 您还可能会在应用程序事件日志中看到以下消息

  Aspnet_wp exe(对于在 Microsoft Internet 信息服务 [IIS] 上运行的应用程序 则为 W wp exe)意外停止

在此过程中 您还可能会发现 Web 服务器的内存使用量增加 回到顶端

原因

Web 服务器计算机的硬件配置决定您可以成功下载的最大文件大小 当 ASP NET 辅助进程(Aspnet_wp exe 对于在 Internet 信息服务 [IIS] 上运行的应用程序 则为 W wp exe)执行文件下载请求时 会出现文件下载对话框 ASP NET 辅助进程开始向 Microsoft Internet 信息服务进程(Inetinfo exe 或 Dllhost exe)发送数据 它不等您单击 确定 即开始发送 根据计算机的配置 IIS 进程可能会处理数据 也可能会将数据缓存在内存中 如果文件太大 在这两个进程相互通信的过程中 数据将被缓存在内存中 这可能会导致服务器上的内存使用量增加 出现此错误的原因是 Web 服务器上的内存限制 回到顶端

替代方法

要解决此问题 请使用以下任一方法 将数据分成较小的部分 然后将其移动到输出流以供下载 从而获取这些数据 以下代码演示了如何完成此操作 重要说明 当您在 ASP NET 应用程序的 nfig 文件中将编译元素的 debug 属性值设置为 false 时 必须针对要下载的文件大小将 server scripttimeout 属性设置为适当的值 默认情况下 server scripttimeout 值被设置为 秒 但是 当 debug 属性被设置为 true 时 server scripttimeout 值将被设置为一个非常大的值( 秒) 作为一名开发人员 您必须知道这可能会对您的 ASP NET Web 应用程序的行为造成的影响 此外 在下面的代码中 您还必须知道与 filestream 构造函数一起使用的参数值 指定的枚举值会对提供的功能产生重大影响 有关更多信息 请参考 参考 一节中的 filestream 链接 visual Basic NET 代码

  Dim iStream As System IO Stream Buffer to read K bytes in chunk: Dim buffer( ) As Byte Length of the file: Dim length As Integer Total bytes to read: Dim dataToRead As Long Identify the file to download including its path Dim filepath As String = DownloadFileName Identify the file name Dim filename As String = System IO Path GetFileName(filepath) Try Open the file iStream = New System IO FileStream(filepath System IO FileMode Open _ IO FileAccess Read IO FileShare Read) Total bytes to read: dataToRead = iStream Length Response ContentType = application/octet stream Response AddHeader( Content Disposition attachment; filename= & filename) Read the bytes While dataToRead > Verify that the client is connected If Response IsClientConnected Then Read the data in buffer length = iStream Read(buffer ) Write the data to the current output stream Response OutputStream Write(buffer length) Flush the data to the HTML output Response Flush() ReDim buffer( ) Clear the buffer dataToRead = dataToRead length Else prevent infinite loop if user disconnects dataToRead = End If End While Catch ex As Exception Trap the error if any Response Write( Error : & ex Message) Finally If IsNothing(iStream) = False Then Close the file iStream Close() End If End Try

Visual C# NET 代码

  System IO Stream iStream = null; // Buffer to read K bytes in chunk: byte[] buffer = new Byte[ ]; // Length of the file: int length; // Total bytes to read: long dataToRead; // Identify the file to download including its path string filepath = DownloadFileName ; // Identify the file name string filename = System IO Path GetFileName(filepath); try { // Open the file iStream = new System IO FileStream(filepath System IO FileMode Open System IO FileAccess Read System IO FileShare Read); // Total bytes to read: dataToRead = iStream Length; Response ContentType = application/octet stream ; Response AddHeader( Content Disposition attachment; filename= + filename); // Read the bytes while (dataToRead > ) { // Verify that the client is connected if (Response IsClientConnected) { // Read the data in buffer length = iStream Read(buffer ); // Write the data to the current output stream Response OutputStream Write(buffer length); // Flush the data to the HTML output Response Flush(); buffer= new Byte[ ]; dataToRead = dataToRead length; } else { //prevent infinite loop if user disconnects dataToRead = ; } } } catch (Exception ex) { // Trap the error if any Response Write( Error : + ex Message); } finally { if (iStream != null) { //Close the file iStream Close(); } }

将 DownloadFileName 替换为大于 MB 的文件的名称 或 &# ; 为用户提供用于下载文件的链接 或 &# ; 使用 Microsoft ASP 进行下载或者与 ASP 一起使用 Sofare Artisans FileUp 或 &# ; 创建 ISAPI 扩展以下载文件 或 &# ; 使用 FTP 下载文件 回到顶端

状态

这种现象是设计导致的 回到顶端

更多信息

重现此问题的步骤

在 Microsoft Visual Basic NET 或 Microsoft Visual C# NET 中 新建一个 Web 应用程序项目 默认情况下 将创建 WebForm aspx 将一个按钮对象从工具箱拖到 WebForm aspx 双击该按钮对象以便在代码视图中打开 click 事件 将以下代码粘贴到 Button click 事件中 visual Basic NET 代码

   Identify the file to download including its path Dim filepath As String = DownloadFileName Identify the file name Dim filename As String = System IO Path GetFileName(filepath) Response Clear() Specify the Type of the downloadable file Response ContentType = application/octet stream Set the Default file name in the FileDownload dialog box Response AddHeader( Content Disposition attachment; filename= & filename & ) Response Flush() Download the file Response WriteFile(filepath)

Visual C# NET 代码 将 DownloadFileName 替换为大于 MB 的文件的名称 在 调试 菜单上 单击 开始 单击 Button lishixinzhi/Article/program/net/201311/13320  
永远跟党走
  • 如果你觉得本站很棒,可以通过扫码支付打赏哦!

    • 微信收款码
    • 支付宝收款码