将 .xlsx 文件写入磁盘并读入字节数组会导致尝试打开文件时出错

Writing .xlsx file to disk and reading into a byte array results in error when attempting to open the file

提问人:ITM 提问时间:9/22/2023 最后编辑:LarsTechITM 更新时间:9/23/2023 访问量:60

问:

使用 VB.NET,我们将一个 .xlsx(Excel 工作簿)文件写入磁盘,然后读入字节数组。使用文件资源管理器打开 Excel 工作簿可以正常工作,但将字节数组写入响应输出流并在任何浏览器中打开下载的文件都会显示错误消息(见下文)。

常规 Excel (.xls) 文件上不会发生此错误。

Microsoft Excel:我们发现“xxx.xlsx”中的某些内容存在问题。你希望我们尽可能多地恢复吗?

Dim tB As Byte() = File.ReadAllBytes(diskOpts.DiskFileName) 
Response.Clear() 
Response.Buffer = True 
Response.ContentType = sUtilities.Instance.GetMimeType(tExtens) 
Response.AddHeader("Content-Disposition", "filename=" & fRep.Name & "." & tExtens)
Response.OutputStream.Write(tB, 0, tB.Length) `
Excel vb.net MIME 类型

评论

0赞 Andrew Morton 9/22/2023
看起来您正在使用 ASPX 页发送文件;如果是这种情况,则应改用 ASHX 处理程序
0赞 ITM 9/22/2023
这适用于除 Excel Workbook 之外的所有 MIME 类型。我们对常规Excel(.xls)使用相同的过程,没有任何问题。
0赞 Andrew Morton 9/22/2023
您是否使用十六进制编辑器将原始文件与错误的下载文件进行比较,看看有什么不同?

答:

1赞 dbasnett 9/22/2023 #1

你试过这样吗?

    Response.AddHeader("Content-Disposition", String.Format("attachment; filename={0}", fileName))
    Response.ContentType = "application/vnd.ms-excel"
    Response.WriteFile(fileName)

编辑

我查看了我们的网站,该网站允许用户下载各种文件。此代码适用于 .xslx 文件。

                Dim fi As New IO.FileInfo(docPath)
                Response.Clear()
                Response.ClearHeaders()
                Response.ClearContent()
                Dim ext As String = IO.Path.GetExtension(docPath).ToLower
                If ext = ".pdf" Then
                    Response.ContentType = "application/pdf"
                Else
                    Response.ContentType = "application/octet-stream"
                End If
                Response.AppendHeader("Content-Disposition", "attachment; filename=" & IO.Path.GetFileName(docPath))
                Response.AppendHeader("Content-Length", fi.Length.ToString())
                Response.BufferOutput = True
                Response.TransmitFile(docPath)
                Response.End()

评论

1赞 Andrew Morton 9/22/2023
甚至代替 WriteFile,它将工作移交给 IIS。TransmitFile(String):“将指定的文件直接写入 HTTP 响应输出流,而不将其缓冲在内存中。Response.TransmitFile(filename)
0赞 ITM 9/22/2023
同样的问题。尝试在 Excel 中打开文件时出现错误。同样,在写入 .xls 文件时,整个过程都有效。
0赞 dbasnett 9/22/2023
@ITM - 请参阅上面的编辑。安德鲁说得很对,几年前我一定得出了同样的结论。