我想从网站上下载文件,但是除非加载了其他页面,否则特定的URL无效。
我从字面上调用网络浏览器来加载页面,然后调用另一个页面来下载文件。
这有效,但我讨厌...
static void Main(string[] args)
{
//Open website
Process.Start("chrome.exe", "https://www.fapiis.gov/fapiis/allfapiisdata.action");
//Wait 20 sec
System.Threading.Thread.Sleep(20000);
//DownLoad File
Process.Start("Chrome.exe", "https://www.fapiis.gov/fapiis/downloadview?type=allFapiis");
//Wait 10 sec
System.Threading.Thread.Sleep(10000);
//Close Chrome
Process[] chromeInstances = Process.GetProcessesByName("chrome");
foreach (Process p in chromeInstances)
{ p.Kill(); }
//Move file for SSIS Processing
string[] files = System.IO.Directory.GetFiles(@"C:\Users\xxxx\Downloads", "AllFapiis*");
foreach (string file in files)
{
string fname = System.IO.Path.GetFileName(file);
System.IO.File.Copy(file, @"C:\xxxxx\FAPIIS\" + fname);
System.IO.File.Delete(file);
}
}
我尝试使用webclient,但是它永远找不到第二页。还有其他无需调用浏览器的方式吗?另一个问题是我无法确定下载位置。它会自动以我的用户帐户进行下载。
答案 0 :(得分:3)
您试图从中下载的站点使用cookie。 因此,一旦您导航到第一页,就会将一些cookie设置为浏览器。 这样可以在第二页上进行下载。
您可以使用以下代码完成此操作:
static async Task TryDownload()
{
var clientHandler = new HttpClientHandler
{
AllowAutoRedirect = true,
UseCookies = true,
CookieContainer = new CookieContainer()
};
using (var httpClient = new HttpClient(clientHandler))
{
// this gets the request and allows the site to set cookies.
var warmup = await httpClient.GetAsync("https://www.fapiis.gov/fapiis/allfapiisdata.action");
// get the file (cookies are sent automatically).
var fileResponse = httpClient.GetAsync("https://www.fapiis.gov/fapiis/downloadview?type=allFapiis");
if (fileResponse.Result.IsSuccessStatusCode)
{
HttpContent content = fileResponse.Result.Content;
var contentStream = await content.ReadAsStreamAsync();
using (var fileStream = File.Create("C:\\temp\\a.xlsx"))
{
contentStream.CopyTo(fileStream);
}
}
}
}
输出:
Excel file in c:\temp (662,044 bytes)