在 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);
}
我有一个 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);
}