问题描述
当我在浏览器中打开此excel文件link时,它将成功下载。 但是当我通过以下c#代码下载它时
private void downloadFile()
{
string remoteUri = "http://members.tsetmc.com/tsev2/excel/MarketWatchPlus.aspx?d=0";
string fileName = @"g:\temp.xlsx";
using (var client = new WebClient())
{
client.DownloadFile(remoteUri,fileName);
}
}
我的代码有什么问题?
解决方法
解压缩文件并写入。
string remoteUri = "http://members.tsetmc.com/tsev2/excel/MarketWatchPlus.aspx?d=0";
string fileName = @"g:\temp.xlsx";
using (var client = new WebClient())
{
using var stream = client.OpenRead(remoteUri);
using var zipStream = new GZipStream(stream,CompressionMode.Decompress);
using var resultStream = new MemoryStream();
zipStream.CopyTo(resultStream);
File.WriteAllBytes(fileName,resultStream.ToArray());
}
,
如果查看remoteUri提供的响应标头,您会注意到特定端点实际上正在以压缩格式提供内容。
Content-Encoding: gzip
因此,您获取的内容不是直接的excel文件,而是zip文件。因此,为了使代码起作用,文件名应为 temp.zip
而不是 temp.xlsx
private void downloadFile()
{
string remoteUri = "http://members.tsetmc.com/tsev2/excel/MarketWatchPlus.aspx?d=0";
string fileName = @"g:\temp.zip";
using (var client = new WebClient())
{
client.DownloadFile(remoteUri,fileName);
}
}
话虽如此,内联是下载文件的更好方法。
通过传入HttpClient
属性,将HttpClientHandler
设置为AutomaticDecompression
来创建DecompressionMethods.GZip
的实例,以自动处理Gzip解压缩。接下来,读取数据并将其保存到temp.xlsx
文件中。
string remoteUri = "http://members.tsetmc.com/tsev2/excel/MarketWatchPlus.aspx?d=0";
string fileName = @"g:\temp.xlsx";
HttpClientHandler handler = new HttpClientHandler()
{
AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate
};
HttpClient client = new HttpClient(handler);
var response = await client.GetAsync(remoteUri);
var fileContent = await response.Content.ReadAsByteArrayAsync();
File.WriteAllBytes(fileName,fileContent);