Asp.net 损坏的ZIP文件下载
我正在尝试使用SharpZipLib创建ZIP文件并将其发送到客户端,在没有网格的页面中,代码工作正常,但在有网格的页面中,文件总是损坏的 我尝试在ZIP文件下载方法的末尾使用HttpContext.Current.Response.End(),它成功了,但这意味着ThreadAbortException,之后我无法执行额外的代码 下面是我用来创建和下载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
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){}
它只是复制方法根据需要使用的缓冲区。大小无关紧要(就问题而言)。实际上,它会根据需要多次填充和清空缓冲区。