HTTP GET 返回二进制而不是文本
HTTP GET returning binary in instead of text
我想从 http 应用程序 MicroStrategy 获取一个 csv 文件,但我得到的是一个可以打开的二进制文件在 Excel 但不是在文本编辑器中。
当我在浏览器中使用相同的 url 时,它会以文本形式下载,因此可以在文本编辑器中打开。
这是相关的(我认为)行:
HttpClient cliente;
cliente = new HttpClient(handler) { BaseAddress = uri, Timeout = new TimeSpan(0, 30, 0) };
...
string csv;
responseMessage = await cliente.GetAsync(uri);
HttpContentHeaders contentHeaders = responseMessage.Content.Headers;
csv = await responseMessage.Content.ReadAsStringAsync();
File.WriteAllText(caminhoArquivo, csv, Encoding.UTF8);
headers 显示正确 Content-Type:
responseMessage.Content.Headers = {Content-Length: 6188
Content-Disposition: attachment;filename=Grupo Cont%C3%A1bil.txt;
Content-Type: text/plain
}
只是读取字节和写入字节这是十六进制查看器中的文件:
byte[] bytes;
bytes = await responseMessage.Content.ReadAsByteArrayAsync();
File.WriteAllBytes(caminhoArquivo, bytes);
Offset: 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
00000000: 47 00 72 00 75 00 70 00 6F 00 20 00 43 00 6F 00 G.r.u.p.o...C.o.
00000010: 6E 00 74 00 EF BF BD 00 62 00 69 00 6C 00 0D 00 n.t.o?=.b.i.l...
00000020: 0A 00 0D 00 0A 00 47 00 72 00 75 00 70 00 6F 00 ......G.r.u.p.o.
如果它在浏览器中有效,你可以尝试添加任何有效的 User-Agent header,也许服务器端有一些技巧
通过评论发现,问题出在编码上。
即使客户端代码使用了字符串下载例程,显然服务器没有指定编码 [在 all/correctly],因此被发现是 UTF16 编码的文本很可能被解释为其他内容UTF8.
最后的结果是文件有点乱,后来打开的时候被误读了。
修复代码以将其下载为原始字节,而不是对它们进行解码或编码,而是将它们简单地放入文件中,这样就可以以 UTF16 格式打开文件并获取文本内容。
理想情况下,服务器应该指定传送内容时使用的编码,但有时在下载文件时,传送文件的服务器代码可能不知道文件内容的编码,通常是因为文件是由第 3 方代码生成的,或者已经以未知编码存在于磁盘上。
我想从 http 应用程序 MicroStrategy 获取一个 csv 文件,但我得到的是一个可以打开的二进制文件在 Excel 但不是在文本编辑器中。
当我在浏览器中使用相同的 url 时,它会以文本形式下载,因此可以在文本编辑器中打开。
这是相关的(我认为)行:
HttpClient cliente;
cliente = new HttpClient(handler) { BaseAddress = uri, Timeout = new TimeSpan(0, 30, 0) };
...
string csv;
responseMessage = await cliente.GetAsync(uri);
HttpContentHeaders contentHeaders = responseMessage.Content.Headers;
csv = await responseMessage.Content.ReadAsStringAsync();
File.WriteAllText(caminhoArquivo, csv, Encoding.UTF8);
headers 显示正确 Content-Type:
responseMessage.Content.Headers = {Content-Length: 6188
Content-Disposition: attachment;filename=Grupo Cont%C3%A1bil.txt;
Content-Type: text/plain
}
只是读取字节和写入字节这是十六进制查看器中的文件:
byte[] bytes;
bytes = await responseMessage.Content.ReadAsByteArrayAsync();
File.WriteAllBytes(caminhoArquivo, bytes);
Offset: 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
00000000: 47 00 72 00 75 00 70 00 6F 00 20 00 43 00 6F 00 G.r.u.p.o...C.o.
00000010: 6E 00 74 00 EF BF BD 00 62 00 69 00 6C 00 0D 00 n.t.o?=.b.i.l...
00000020: 0A 00 0D 00 0A 00 47 00 72 00 75 00 70 00 6F 00 ......G.r.u.p.o.
如果它在浏览器中有效,你可以尝试添加任何有效的 User-Agent header,也许服务器端有一些技巧
通过评论发现,问题出在编码上。
即使客户端代码使用了字符串下载例程,显然服务器没有指定编码 [在 all/correctly],因此被发现是 UTF16 编码的文本很可能被解释为其他内容UTF8.
最后的结果是文件有点乱,后来打开的时候被误读了。
修复代码以将其下载为原始字节,而不是对它们进行解码或编码,而是将它们简单地放入文件中,这样就可以以 UTF16 格式打开文件并获取文本内容。
理想情况下,服务器应该指定传送内容时使用的编码,但有时在下载文件时,传送文件的服务器代码可能不知道文件内容的编码,通常是因为文件是由第 3 方代码生成的,或者已经以未知编码存在于磁盘上。