下载文件,但似乎必须使用浏览器

时间:2019-09-25 16:25:17

标签: c# visual-studio

我想从网站上下载文件,但是除非加载了其他页面,否则特定的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,但是它永远找不到第二页。还有其他无需调用浏览器的方式吗?另一个问题是我无法确定下载位置。它会自动以我的用户帐户进行下载。

1 个答案:

答案 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)