当我通过 C# 代码下载文件时,我得到了错误的文件
I get wrong file when I download it by C# code
当我在浏览器中打开这个 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);
}
}
我在文件资源管理器中打开它,我收到文件格式错误:
我的代码有什么问题?
如果您查看 remoteUri 提供的响应 headers,您会注意到特定端点实际上以压缩格式提供内容。
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);
}
}
话虽如此,内联是下载文件的更好方法。
通过传入 HttpClientHandler
来创建 HttpClient
的实例,其中 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);
解压文件并写入。
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());
}
当我在浏览器中打开这个 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);
}
}
我在文件资源管理器中打开它,我收到文件格式错误:
我的代码有什么问题?
如果您查看 remoteUri 提供的响应 headers,您会注意到特定端点实际上以压缩格式提供内容。
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);
}
}
话虽如此,内联是下载文件的更好方法。
通过传入 HttpClientHandler
来创建 HttpClient
的实例,其中 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);
解压文件并写入。
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());
}