我用C#代码下载文件时出错了

我用C#代码下载文件时出错了,c#,excel,download,webclient,C#,Excel,Download,Webclient,当我在浏览器中打开此excel文件时,它将被成功下载。 但是当我用下面的c代码下载它时 在文件资源管理器中打开时,会出现文件格式错误: 我的代码有什么问题?如果查看remoteUri提供的响应头,您会注意到特定端点实际上是以压缩格式提供内容的 Content-Encoding: gzip 因此,返回的内容不是直接的excel文件,而是zip文件。因此,为了让代码正常工作,文件名应该是temp.zip,而不是temp.xlsx 话虽如此,内联是下载文件的更好方法。 通过传入HttpClien

当我在浏览器中打开此excel文件时,它将被成功下载。 但是当我用下面的c代码下载它时

在文件资源管理器中打开时,会出现文件格式错误:


我的代码有什么问题?

如果查看remoteUri提供的响应头,您会注意到特定端点实际上是以压缩格式提供内容的

Content-Encoding: gzip

因此,返回的内容不是直接的excel文件,而是zip文件。因此,为了让代码正常工作,文件名应该是
temp.zip
,而不是
temp.xlsx

话虽如此,内联是下载文件的更好方法。 通过传入
HttpClientHandler
来创建
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);
解压文件并写入

        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());

        }

您确定该链接上的工作簿是.xlsx文件类型吗?@ArcherBird单击该链接并下载它,然后检查感谢您的回复。但主要的问题是当你点击链接时,浏览器会下载并保存一个excel文件。我的代码和浏览器行为之间有什么区别?浏览器所做的远不止是下载内容。它查看响应标题并自动为您执行解压缩。@VDWWD有一个细微的区别,temp.zip而不是temp.xlsx。这就不同了,我没看到。对不起。你怎么知道它是压缩的?你怎么知道文件是压缩的,需要手动解压缩?为什么WebClient不自动进行解压缩?压缩部分应该是下载的静默部分,如果客户端不接受压缩内容,则客户端不应说它接受压缩内容,如果客户端不说它接受压缩内容,则服务器不应响应压缩内容。同样,您如何知道文件已压缩?@LasseV.Karlsen这是一个特定于问题的解决方案。
WebClient
的默认行为是非自动解压缩。如果我们有通用下载程序,我们可以继承
WebClient
并像这样重写
GetWebRequest
方法,但是WebClient是否表示它接受压缩内容?@LasseV.Karlsen可以静默地进行解压缩。这完全取决于客户端的设置方式。例如,在我的回答中,我设置了httpclient,以便通过处理程序自动解压缩内容。有了它,httpclient可以自动解压缩数据并提供给您。不必担心服务器是否压缩了响应。那么,答案中不应该有神秘的部分吗?将来,如果有人来到这里想知道为什么WebClient会产生损坏的文件,他们如何知道压缩是否是他们的答案?
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());

        }