我正在尝试使用API从Web应用程序下载.xlsx文件。但是,文件的字符串内容始终是乱码的,并且似乎包含XML内容。我假设它的XML,因为它在第一行中提到了'[Content_Types] .xml'。
响应标头提到返回的内容类型是'application / octet-stream'。我尝试在我的请求标头中添加content-type =“application / vnd.openxmlformats-officedocument.spreadsheetml.sheet”,但Web应用程序“无法识别”该操作。所以我不能返回.xlsx类型的文件......
当我尝试下载此文件并将其保存为.xlsx时,我无法打开它,因为它总是说该文件已损坏。但是,使用Postman下载文件没有损坏。在下载和保存二进制64位基本编码数据时,我不确定我在哪里出错。请帮忙!这是我正在使用的代码下载和保存文件。
If My.Computer.FileSystem.DirectoryExists(DownloadLocation) = False Then
MsgBox("Folder path '" & DownloadLocation & "' does not exist.", MsgBoxStyle.Information)
Return
End If
Dim url As String = 'I am setting the URL here, tested on postman and no issues here
使用函数从响应头获取文件名,文件路径和名称没有问题。
Dim Filepath As String = DownloadLocation & "\" & filename.Split(".").First & "_" & Format(Now, "yyyymmdd hhmmss") & "." & filename.Split(".").Last
Dim credentials As String = ""
credentials = "Basic " + Convert.ToBase64String(Encoding.UTF8.GetBytes(LoginName + ":" + PW))
Dim Request As HttpWebRequest = DirectCast(HttpWebRequest.Create(url), HttpWebRequest)
With Request
.Headers.Set(HttpRequestHeader.Authorization, credentials)
.Headers.Set("X-Application-Key", My.Settings.APIKey)
.Method = "GET"
.AutomaticDecompression = DecompressionMethods.GZip
End With
Try
Dim response As HttpWebResponse
response = Request.GetResponse
Dim stream As Stream = response.GetResponseStream
Dim reader As New StreamReader(stream)
Dim Ofile As FileStream = New FileStream(Filepath, FileMode.Create)
Dim Owrite As StreamWriter = New StreamWriter(Ofile)
Owrite.Write(reader.ReadToEnd)
reader.Close()
Owrite.Close()
Ofile.Close()
Catch ex As Exception
MsgBox("Download failed..." & vbNewLine & vbNewLine & ex.ToString, MsgBoxStyle.Information)
Return
End Try
该文件保存为.xlsx文件,但当我尝试打开该文件时,Excel表示该文件已损坏。有谁知道这里发生了什么?
答案 0 :(得分:0)
删除GZip解压缩。首先,你不需要它。其次,它给你带来了麻烦。
XLSX文件是一组压缩成一个文件的XML文件。并重命名为.xlsx扩展名。获取任何xlsx文件,将其重命名为zip并解压缩内容。您将看到XML结构及其目录。
AutomaticDecompression可以在响应流字节中检测* ZIP,并在客户端为您解压缩。
GZipping不需要压缩内容,因为在大多数情况下压缩压缩文件会使其变大。由于消息的熵已经最大化。