通过C#代码下载文件时出现错误文件

问题描述

当我在浏览器中打开此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);
        }
    }

然后在文件资源管理器中将其打开,出现文件格式错误

enter image description here

我的代码有什么问题?

解决方法

解压缩文件并写入。

        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

Response Headers Snap

因此,您获取的内容不是直接的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);