提问人:ITM 提问时间:9/22/2023 最后编辑:LarsTechITM 更新时间:9/23/2023 访问量:60
将 .xlsx 文件写入磁盘并读入字节数组会导致尝试打开文件时出错
Writing .xlsx file to disk and reading into a byte array results in error when attempting to open the file
问:
使用 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) `
答:
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 - 请参阅上面的编辑。安德鲁说得很对,几年前我一定得出了同样的结论。
评论