当我通过 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());

        }