Загрузите файл Json с URL с помощью индикатора выполнения - PullRequest
0 голосов
/ 15 мая 2018

Мне нужно скачать большие файлы JSON с URL. Используется метод post, с параметром, именем пользователя, паролем и т. Д.

Поскольку это занимает довольно много времени, я пытаюсь установить индикатор выполнения, чтобы пользователи могли видеть, как далеко он продвинулся и сколько осталось.

Задача

Я не могу получить длину содержимого файла Json из URL до загрузки. Пожалуйста, смотрите комментарий об ошибке в коде ниже. Есть предложения?

public void downloadJson(string Url, string UserName, string Password, string FileDownload)
{
    HttpWebRequest httpRequest;
    HttpWebResponse httpResponse;
    int Size;

    var json = string.Format("{{\"user\":\"{0}\",\"pwd\":\"{1}\",\"DS\":\"KG\"}}", UserName, Password);

    httpRequest = (HttpWebRequest)WebRequest.Create(Url);
    httpRequest.Method = WebRequestMethods.Http.Post;

    httpRequest.ContentLength = json.Length;
    httpRequest.ContentType = "application/json";
    httpRequest.Timeout = 600 * 60 * 1000;

    var data = Encoding.ASCII.GetBytes(json); // or UTF8

    using (var s = httpRequest.GetRequestStream())
    {
        s.Write(data, 0, data.Length);
        s.Close();
    }

    httpResponse = (HttpWebResponse)httpRequest.GetResponse();
    Size = (int)httpResponse.ContentLength;
    Stream rs = httpResponse.GetResponseStream();

    //**********************************************
    //Here is the error
    //the below progress bar would never work
    //Because Size returned from above is always -1
    //**********************************************
    progressBar.Invoke((MethodInvoker)(() => progressBar.Maximum = Size));

    using (FileStream fs = File.Create(FileDownload))
    {
        byte[] buffer = new byte[16 * 1024];
        int read;
        int position;

        using (rs)
        {
            while ((read = rs.Read(buffer, 0, buffer.Length)) > 0)
            {
                fs.Write(buffer, 0, read);
                position = (int)fs.Position;
                progressBar.Invoke((MethodInvoker)(() => progressBar.Value = position));
                Console.WriteLine ("Bytes Received: " + position.ToString());
            }
        }

        fs.Close();
    }

1 Ответ

0 голосов
/ 15 мая 2018

Ошибка может быть здесь;

Size = (int) httpResponse.ContentLength;

Я полагаю, когда вы объявили как int Size;Вы хотели назначить целочисленный тип данных Size

Но похоже, что Size не ведет себя как целочисленный тип данных.

Попробуйте изменить размер на что-то вроде siz и попробуйте снова.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...