【问题标题】:Download CSV file with WebClient in C# but the size of file is less than when download with browser在 C# 中使用 WebClient 下载 CSV 文件,但文件大小小于使用浏览器下载时的大小
【发布时间】:2022-02-18 06:56:22
【问题描述】:

我有一个返回 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");

【问题讨论】:

    标签: c# .net webclient


    【解决方案1】:

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

    screenshot from RestClient

    【讨论】:

    【解决方案2】:

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

    How to Download the File using HttpWebRequest and HttpWebResponse class(Cookies,Credentials,etc.)

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

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

    【讨论】:

      【解决方案3】:

      您需要先解压缩 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]\Desktop\111.csv
          gs.CopyTo(s);
      }
      

      【讨论】:

        猜你喜欢
        • 2019-01-20
        • 1970-01-01
        • 1970-01-01
        • 2011-08-06
        • 1970-01-01
        • 1970-01-01
        • 2012-06-06
        • 2010-10-23
        • 1970-01-01
        相关资源
        最近更新 更多