Asp.net 损坏的ZIP文件下载

Asp.net 损坏的ZIP文件下载,asp.net,vb.net,webforms,Asp.net,Vb.net,Webforms,我正在尝试使用SharpZipLib创建ZIP文件并将其发送到客户端,在没有网格的页面中,代码工作正常,但在有网格的页面中,文件总是损坏的 我尝试在ZIP文件下载方法的末尾使用HttpContext.Current.Response.End(),它成功了,但这意味着ThreadAbortException,之后我无法执行额外的代码 下面是我用来创建和下载ZIP文件的代码 Public Function ExportToZIPFile(ByVal dataTable As DataTable, o

我正在尝试使用SharpZipLib创建ZIP文件并将其发送到客户端,在没有网格的页面中,代码工作正常,但在有网格的页面中,文件总是损坏的

我尝试在ZIP文件下载方法的末尾使用HttpContext.Current.Response.End(),它成功了,但这意味着ThreadAbortException,之后我无法执行额外的代码

下面是我用来创建和下载ZIP文件的代码

Public Function ExportToZIPFile(ByVal dataTable As DataTable, orderID As Integer, downloadedZIPFileName As String, ByRef zipFilePassword As String) As Boolean
    Dim isSuccess As Boolean = False
    Dim excelFilePath As String = Hosting.HostingEnvironment.MapPath("~/Test.xls")
    Try
        Using streamWriter As StreamWriter = New StreamWriter(excelFilePath)
            For i As Integer = 0 To dataTable.Columns.Count - 1
                streamWriter.Write(dataTable.Columns(i).ToString().ToUpper() & vbTab)
            Next

            streamWriter.WriteLine()
            For i As Integer = 0 To (dataTable.Rows.Count) - 1

                For j As Integer = 0 To dataTable.Columns.Count - 1

                    If dataTable.Rows(i)(j) IsNot Nothing Then
                        streamWriter.Write(Convert.ToString(dataTable.Rows(i)(j)) & vbTab)
                    Else
                        streamWriter.Write(vbTab)
                    End If
                Next

                streamWriter.WriteLine()
            Next

            streamWriter.Close()
        End Using

        zipFilePassword = "123456"

        SendPasswordInMessage(orderID, zipFilePassword)

        HttpContext.Current.Response.ContentType = "application/x-zip-compressed"
        HttpContext.Current.Response.AppendHeader("content-disposition", "attachment;filename=" + downloadedZIPFileName + ".zip")

        Using zipOutput As ZipOutputStream = New ZipOutputStream(HttpContext.Current.Response.OutputStream)
            zipOutput.Password = zipFilePassword
            Dim ZipEntry As ZipEntry = New ZipEntry(Path.GetFileName(excelFilePath))
            zipOutput.PutNextEntry(ZipEntry)
            Using fread = File.OpenRead(excelFilePath)
                Dim buffer As Byte() = New Byte(8191) {}
                ICSharpCode.SharpZipLib.Core.StreamUtils.Copy(fread, zipOutput, buffer)
            End Using

            zipOutput.Finish()
        End Using

        HttpContext.Current.Response.Flush()
        HttpContext.Current.Response.End()
        isSuccess = True
    Catch tah As ThreadAbortException

    Catch ex As Exception
        MStartLogger.Error(ex, Me.GetType.Name, MethodBase.GetCurrentMethod().Name, "")
    Finally
        If File.Exists(excelFilePath) Then
            File.Delete(excelFilePath)
        End If
    End Try
    Return isSuccess
End Function

我认为问题在于HttpContext.Current.Response没有花时间创建文件并下载它,因此我希望创建ZIP文件并下载它,然后返回一条成功消息,返回到我以前的代码中

我认为问题在于在这一行中将缓冲区数组限制为8191

Dim buffer As Byte()=新字节(8191){}

我建议改成


Dim buffer As Byte()=新字节(fread.length){}

它只是复制方法根据需要使用的缓冲区。大小无关紧要(就问题而言)。实际上,它会根据需要多次填充和清空缓冲区。