Загрузите файл, но мне кажется, что я должен сделать это с помощью браузера - PullRequest
0 голосов
/ 25 сентября 2019

Я хотел бы загрузить файл с веб-сайта, но определенный 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);
            }
        }

Я пытался использовать веб-клиент, но он никогда не может найти 2-ую страницу.Есть ли другой способ сделать это без вызова браузера?Другая проблема в том, что я не могу указать, куда идет загрузка.Он автоматически загружается в мою учетную запись.

1 Ответ

3 голосов
/ 25 сентября 2019

Сайт, который вы пытаетесь скачать, использует куки.Поэтому после перехода на первую страницу в браузере устанавливаются некоторые файлы 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...