在 C# 中使用 WebClient 下载 CSV 文件,但文件大小小于使用浏览器下载时的大小

Download CSV file with WebClient in C# but the size of file is less than when download with browser

我有一个 link 那个 returns 一个 CSV 文件。当我在浏览器(Chrome、Firefox 等)中打开它时,下载的文件大小为 86 KB,但是当我想使用下面的代码下载它时,大小仅为 25 KB,而当我打开下载的文件,它没有正确的数据(意味着没有列并且无法读取数据)

你可以在浏览器和代码中试试

http://tsetmc.com/tsev2/data/Export-txt.aspx?t=i&a=1&b=0&i=43283802997035462

string url = "http://tsetmc.com/tsev2/data/Export-txt.aspx?t=i&a=1&b=0&i=43283802997035462";
 WebClient wc = new WebClient();
 wc.DownloadFile(url, "111.csv");

webClient 向您返回 zip 文件而不是纯文本 /csv 文件 我将 wc 输出文件扩展名更改为 zip,它正在工作...... zip 将包含您在参数

中指定的文件

screenshot from RestClient

正如 Akshay Sandhu 指出的那样,下载的文件是使用 gzip 编码压缩的,这就是为什么在尝试将其作为 csv 打开时它显示为已损坏的原因。 要下载文件并自动解码,请参阅这两个 SO 答案。 首先使用 HttpWebRequest class 而不是 WebClient class 下载文件,如下所示:

然后确保文件自动解压。看看这个

Automatically decompress gzip response via WebClient.DownloadData

这是工作代码:

string url = "http://tsetmc.com/tsev2/data/Export-txt.aspx?t=i&a=1&b=0&i=43283802997035462";
string path = "111.csv";

using (FileStream fileStream = new FileStream(path, System.IO.FileMode.OpenOrCreate, System.IO.FileAccess.Write))
{
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
    request.Method = WebRequestMethods.Http.Get;
    request.AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip;

    const int BUFFER_SIZE = 16 * 1024;
    using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
    {
        using (var responseStream = response.GetResponseStream())
        {
            var buffer = new byte[BUFFER_SIZE];
            int bytesRead;
            do
            {
                bytesRead = responseStream.Read(buffer, 0, BUFFER_SIZE);
                fileStream.Write(buffer, 0, bytesRead);
            } while (bytesRead > 0);
        }
    }
}

在将其读取到文件之前,您需要解压缩 gzip。

var url = new Uri("http://tsetmc.com/tsev2/data/Export-txt.aspx?t=i&a=1&b=0&i=43283802997035462");
var path = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
var fileName = "111.csv";

using (WebClient wc = new WebClient())
using (Stream s = File.Create(Path.Combine(path, fileName)))
using (GZipStream gs = new GZipStream(wc.OpenRead(url), CompressionMode.Decompress))
{
    //Saves to C:\Users\[YourUser]\Desktop1.csv
    gs.CopyTo(s);
}