С Новым годом! Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/35: Рейтинг темы: голосов - 35, средняя оценка - 4.54
Эксперт С++
8483 / 6150 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
1

Скачивание из интернета

18.06.2012, 21:12. Показов 6360. Ответов 16
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Как можно загрузить содержимое html странички с интернета?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
18.06.2012, 21:12
Ответы с готовыми решениями:

Скачивание из Интернета
Сделал программу для скачивания файлов из сети, но при работе она намертво зависает. Как отловить...

Скачивание из интернета
Здравствуйте, помогите переделать кусок кода. Необходимо скачивание файла с сайта по прямой...

Скачивание файла из интернета
Пытаюсь скачать файл из интернета с помощью URLDownloadToFile(0,...

Скачивание файла из интернета
Подскажите пожалуйста простой способ скачать файл из интернета. Пробовал использовать...

16
Модератор
3401 / 2172 / 353
Регистрация: 13.01.2012
Сообщений: 8,421
19.06.2012, 13:25 2
через сокеты. через GET запрос.

Добавлено через 12 минут
примерно вот так (пример для Windows с возможностью работать через proxy, переделывается для Linux достаточно быстро):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
//------------------------------------------------------------------------------
#include <winsock>
#include <stdio.h>
#include <string>
#include <fstream>
#include <strstream>
//------------------------------------------------------------------------------
int get_addr(char *host_name)
{
    int res = -1;
 
    HOSTENT *phe = gethostbyname(host_name);
    if (phe)
        for (int i = 0; i < 4; i++)
            ((BYTE *)&res)[i] = phe->h_addr_list[0][i];
 
    return res;
}
//------------------------------------------------------------------------------
static const std::string base64_chars =
             "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
             "abcdefghijklmnopqrstuvwxyz"
             "0123456789+/";
 
std::string base64_encode(unsigned char const* bytes_to_encode, unsigned int in_len) {
  std::string ret;
  int i = 0;
  int j = 0;
  unsigned char char_array_3[3];
  unsigned char char_array_4[4];
 
  while (in_len--) {
    char_array_3[i++] = *(bytes_to_encode++);
    if (i == 3) {
      char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
      char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);
      char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);
      char_array_4[3] = char_array_3[2] & 0x3f;
 
      for(i = 0; (i <4) ; i++)
        ret += base64_chars[char_array_4[i]];
      i = 0;
    }
  }
 
  if (i)
  {
    for(j = i; j < 3; j++)
      char_array_3[j] = '\0';
 
    char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
    char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);
    char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);
    char_array_4[3] = char_array_3[2] & 0x3f;
 
    for (j = 0; (j < i + 1); j++)
      ret += base64_chars[char_array_4[j]];
 
    while((i++ < 3))
      ret += '=';
 
  }
 
  return ret;
 
}
//------------------------------------------------------------------------------
int main(int argc, char* argv[])
{
    WSADATA wsa_data;
    if (WSAStartup(0x101, &wsa_data))
    {
        printf("WSAStartup error (%i)\n", WSAGetLastError());
        system("pause");
        return -1;
    }
 
    if (wsa_data.wVersion != 0x101)
    {
        printf("Bad WSA version (%i)\n", wsa_data.wVersion);
        system("pause");
        return -1;
    }
 
    SOCKET s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (s == INVALID_SOCKET)
    {
        printf("socket error (%i)\n", WSAGetLastError());
        system("pause");
        return -1;
    }
 
    int use_host_name;
    char host_name[256];
    char host_ip[256];
    int host_port;
    char doc[256];
 
    printf("use_host_name (0 for host_ip or 1 for host_name): ");
    scanf("%i", &use_host_name);
 
    if (use_host_name)
    {
        printf("host_name: ");
        scanf("%s", host_name);
    }
    else
    {
        printf("host_ip: ");
        scanf("%s", host_ip);
    }
 
    printf("host_port: ");
    scanf("%i", &host_port);
 
    printf("doc (for example /index.htm or /): ");
    scanf("%s", doc);
 
    int use_proxy;
    char proxy_ip[256];
    int proxy_port;
    char proxy_login[256];
    char proxy_password[256];
 
    printf("use_proxy (0 or 1): ");
    scanf("%i", &use_proxy);
 
    if (use_proxy)
    {
        printf("proxy_ip: ");
        scanf("%s", proxy_ip);
 
        printf("proxy_port: ");
        scanf("%i", &proxy_port);
 
        printf("proxy_login: ");
        scanf("%s", proxy_login);
 
        printf("proxy_password: ");
        scanf("%s", proxy_password);
    }
 
    SOCKADDR_IN sa;
    sa.sin_family = AF_INET;
    sa.sin_port = htons(use_proxy? proxy_port : host_port);
    sa.sin_addr.S_un.S_addr = use_proxy? inet_addr(proxy_ip) : (use_host_name? get_addr(host_name) : inet_addr(host_ip));
 
    printf("wait for server...\n");
 
    while (true)
    {
        int connect_res = connect(s, (SOCKADDR *)&sa, sizeof(sa));
        if (!connect_res) break;
 
        Sleep(250);
    }
 
    printf("connected\n");
 
    std::strstream message;
 
    message <<
    "GET http://" << (use_host_name? host_name : host_ip) << ":" << host_port << doc << " HTTP/1.1\r\n"
    "Host: " << (use_host_name? host_name : host_ip) << ":" << host_port << "\r\n";
 
    if (use_proxy)
    {
        std::string _authentication = std::string() + proxy_login + ":" + proxy_password;
        std::string authentication = base64_encode(_authentication.c_str(), _authentication.size());
 
        message <<
        "Proxy-Authorization: Basic " << authentication << "\r\n";
    }
 
    message <<
    "Connection: Close\r\n"
    "\r\n";
 
    std::ofstream _os("to_server", std::ios::binary);
    _os.write(message.str(), message.pcount());
    _os.close();
 
    if (send(s, message.str(), message.pcount(), 0) == SOCKET_ERROR)
    {
        printf("send error (%i)\n", WSAGetLastError());
        system("pause");
        return -1;
    }
 
    char buffer[100000];
    int buffer_size = sizeof(buffer);
    buffer_size = recv(s, buffer, buffer_size, 0);
    if (buffer_size == SOCKET_ERROR)
    {
        printf("recv error (%i)\n", WSAGetLastError());
        system("pause");
        return -1;
    }
    printf("from_server: %s\n", buffer);
 
    std::ofstream os("from_server", std::ios::binary);
    os.write(buffer, buffer_size);
    os.close();
 
    closesocket(s);
 
    WSACleanup();
 
    system("pause");
    return 0;
}
1
Evg
Эксперт CАвтор FAQ
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
19.06.2012, 13:48 3
Если концепция программы позволяет, то можно запустить программу wget, а по завершении забрать файл, который был скачан. Вариант с wget'ом удобен тем, что wget гораздо качественне отработает всякие "плохие" случаи типа редиректа на другой адрес, чем на коленках написанная самоделка.

Наверняка для этих дел есть нормальные библиотеки
0
Эксперт С++
8483 / 6150 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
19.06.2012, 16:00  [ТС] 4
Уже нашел с boost-том пример https://www.cyberforum.ru/cpp-... 29576.html
0
87 / 87 / 1
Регистрация: 19.06.2012
Сообщений: 245
19.06.2012, 22:03 5
Пытаться ковырять HTTP самому, сокетами - фиговая идея. Ответ может быть всячески заэнкожен, загзиплен и на худой конец вместо него может прийти какойнибудь редирект
0
Эксперт С++
8483 / 6150 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
19.06.2012, 22:35  [ТС] 6
Цитата Сообщение от PSIAlt Посмотреть сообщение
Пытаться ковырять HTTP самому, сокетами - фиговая идея. Ответ может быть всячески заэнкожен, загзиплен и на худой конец вместо него может прийти какойнибудь редирект
И... ?
И что вы предлагаете? Как иначе?

А редирект можно обработать... или я ошибаюсь ?

Добавлено через 2 минуты
Цитата Сообщение от vxg Посмотреть сообщение
примерно вот так (пример для Windows с возможностью работать через proxy, переделывается для Linux достаточно быстро):
Если б я умел переделывать, я б вообще такие вопросы не ставил...
0
Evg
Эксперт CАвтор FAQ
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
19.06.2012, 22:46 7
Цитата Сообщение от Avazart Посмотреть сообщение
А редирект можно обработать... или я ошибаюсь ?
Обработать можно всё, что угодно. Но для этого надо иметь на руках описание протокола HTTP и реализовать все заложенные в него возможности. Тогда у тебя будет 100% уверенность в том, что с любого сайта ты сможешь адекватно скачать любую страницу. Другая возможность - самому не реализовывать, а взять чужой код, в котором уже всё реализовано (типа boost'а, но хз насколько полноценно там всё поддержано). Третья возможность - написать что-то самому, как это предложено в посте #2, убедиться, что для скачивания с конкретно нужной страницы этого достаточно и больше не париться. Но при этом надо понимать, что для работы с другой страницей возможно что-то пидётся доработать. Но при этом не заниматься дикой помесью кодов на Си и Си++, технологий для винды и юникса
0
87 / 87 / 1
Регистрация: 19.06.2012
Сообщений: 245
19.06.2012, 23:43 8
Цитата Сообщение от Avazart Посмотреть сообщение
И... ?
И что вы предлагаете? Как иначе?
юзай curl
1
Модератор
3401 / 2172 / 353
Регистрация: 13.01.2012
Сообщений: 8,421
20.06.2012, 09:26 9
Цитата Сообщение от Evg Посмотреть сообщение
на коленках написанная самоделка

Не по теме:

где размер отличающий самоделку от продукта? т.е. wget уже продукт, boost - промежуточное звено между самоделкой и продуктом, а простейший код на сокетах - это чистокровная самоделка)?

Цитата Сообщение от Evg Посмотреть сообщение
не заниматься дикой помесью кодов на Си и Си++, технологий для винды и юникса
?
Цитата Сообщение от PSIAlt Посмотреть сообщение
Ответ может быть всячески заэнкожен, загзиплен и на худой конец вместо него может прийти какойнибудь редирект
если человек свой броузер пишет, то обо всем этом ему так или иначе придется париться. а если цель - конкретная страница, то приведенный код на 99% даст то что нужно.
0
Evg
Эксперт CАвтор FAQ
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
20.06.2012, 11:20 10
Цитата Сообщение от vxg Посмотреть сообщение
где размер отличающий самоделку от продукта?
Про размер не понял. Самоделка - это то, что не учитывает всех возможностей. Конкретно твоя программа будет работать тольуо в том случае, если сервер напрямую тебе выдаст страницу (без таймаута, без сжатия, без редиректов и прочего). Именно это отличает самоделку от продукта: продукт будет работать всегда, самоделка - в некоторых рамках, ограниченных знаниями или желаниями автора

Цитата Сообщение от vxg Посмотреть сообщение
?
Помесь си и си++ очевидна. То, что это код под винду в теме про линукс - тоже очевидно. Однако каюсь, не заметил, что ты прямо написал, что этот код под винду и надо переделывать под линукс.
0
Модератор
3401 / 2172 / 353
Регистрация: 13.01.2012
Сообщений: 8,421
20.06.2012, 14:22 11
Цитата Сообщение от Evg Посмотреть сообщение
Помесь си и си++ очевидна

Не по теме:

в некоторых случаях использование функций printf/scanf в программе "знающей" о существовании потоковых объектов обосновано (религиозные соображения не имеют отношения к тому будет решена задача быстро, наглядно и правильно или невыразительно и с кучей ошибок зато в рамках общего подхода). тем более, что они не осуществляют ввод/вывод на одно устройство. тем более, что данный код не является образцовым чистовиком, а представляет из себя вырезку из нескольких мест скомпонованную по мере возможности для того что бы помочь TC.



Цитата Сообщение от Evg Посмотреть сообщение
Самоделка - это то, что не учитывает всех возможностей.
всех возможностей учесть нельзя) если удариться в рассмотрение наихудшего варианта, то решение будет найдено либо спустя продолжительное время либо не найдено вообще. при таком подходе - самоделка - это все что нас окружает.

Не по теме:

**мега офф**модераторам не читать**никогда не видел большей самоделки чем линукс)

1
Evg
Эксперт CАвтор FAQ
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
20.06.2012, 23:08 12
Цитата Сообщение от vxg Посмотреть сообщение
всех возможностей учесть нельзя
Можно. Правда не всегда получается сделать без ошибок, но можно.

Если есть стандартная реализация и если нет технических проблем для её использования, лучше использовать стандартную реализацию. В тоге у тебя больше времени уйдёт на то, чтобы присать свою программу и меньше времени уйдёт на экспериментальное выяснение собственных косяков в самодельной реализации. Особенно если нет чёткого представления о реализуемом протоколе
0
Эксперт С++
8483 / 6150 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
20.06.2012, 23:17  [ТС] 13
Ок а какие либы можно использовать?
Т.е например нада записывать не файл, а например в std::string ? И Ясное дело обрабатывать/выводить исключения?
0
Evg
Эксперт CАвтор FAQ
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
20.06.2012, 23:18 14
Цитата Сообщение от Avazart Посмотреть сообщение
Ок а какие либы можно использовать?
Конкретно не могу сказать ибо не пользовался. Но те, кто пользовался, должны знать.
0
Эксперт С++
8483 / 6150 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
21.06.2012, 02:22  [ТС] 15
Пробую библиотеку curl - кстати кросплатформена

Установил так:
Bash
1
sudo apt-get install curl libcurl3 libcurl3-dev
Нашел код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
//подключаем необходимые заголовочные файлы
#include <string>
#include <iostream>
#include "curl/curl.h"
//подключаем стандартное пространство имен
using namespace std;
//объявляем буфер, для хранения возможной ошибки, размер определяется в самой библиотеке
static char errorBuffer[CURL_ERROR_SIZE];
//объялвяем буфер принимаемых данных
static string buffer;
//функция обратного вызова
static int writer(char *data, size_t size, size_t nmemb, string *buffer)
{
  //переменная - результат, по умолчанию нулевая
  int result = 0;
  //проверяем буфер
  if (buffer != NULL)
  {
    //добавляем к буферу строки из data, в количестве nmemb
    buffer->append(data, size * nmemb);
    //вычисляем объем принятых данных
    result = size * nmemb;
  }
  //вовзращаем результат
  return result;
}
//--------------главная функция----------------------------
int main()
{
  //необходимые CURL объекты
  CURL *curl;
  CURLcode result;
  //инициализируем curl
  curl = curl_easy_init();
  //проверяем результат инициализации
  if (curl)
    {
      //задаем все необходимые опции
      //определяем, куда выводить ошибки
      curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, errorBuffer);
      //задаем опцию - получить страницу по адресу [url]http://google.com[/url]
      curl_easy_setopt(curl, CURLOPT_URL, "google.com");
      //указываем прокси сервер
      curl_easy_setopt(curl, CURLOPT_PROXY, "proxy:8080");
      //задаем опцию отображение заголовка страницы
      curl_easy_setopt(curl, CURLOPT_HEADER, 1);
      //указываем функцию обратного вызова для записи получаемых данных
      curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writer);
      //указываем куда записывать принимаемые данные
      curl_easy_setopt(curl, CURLOPT_WRITEDATA, &buffer);
      //запускаем выполнение задачи
      result = curl_easy_perform(curl);
      //проверяем успешность выполнения операции
      if (result == CURLE_OK)      
      //выводим полученные данные на стандартный вывод (консоль)
        cout << buffer << "\n";              
      else      
        //выводим сообщение об ошибке
        cout << "Ошибка! " << errorBuffer << endl;        
     }
  //завершаем сессию
  curl_easy_cleanup(curl);
  return 0;
}
Bash
1
g++ main.cpp -o prog -lcurl
Но при запуске выдаёт:
Код
Ошибка! Couldn't resolve proxy 'proxy'
Разбираюсь...

Добавлено через 12 минут
http://curl.haxx.se/libcurl/c/

Добавлено через 1 час 37 минут
Ага вот кое что под добавил (сохраняет в файл)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
//подключаем необходимые заголовочные файлы
#include <string>
#include <iostream>
#include <fstream>
#include "curl/curl.h"
//подключаем стандартное пространство имен
using namespace std;
//объявляем буфер, для хранения возможной ошибки, размер определяется в самой библиотеке
static char errorBuffer[CURL_ERROR_SIZE];
//объялвяем буфер принимаемых данных
static string buffer;
//функция обратного вызова
static int writer(char *data, size_t size, size_t nmemb, string *buffer)
{
  //переменная - результат, по умолчанию нулевая
  int result = 0;
  //проверяем буфер
  if (buffer != NULL)
  {
    //добавляем к буферу строки из data, в количестве nmemb
    buffer->append(data, size * nmemb);
    //вычисляем объем принятых данных
    result = size * nmemb;
  }
  //вовзращаем результат
  return result;
}
//--------------главная функция----------------------------
int main()
{
  //необходимые CURL объекты
  CURL *curl;
  CURLcode result;
  //инициализируем curl
  curl = curl_easy_init();
  //проверяем результат инициализации
  if (curl)
    {
      //задаем все необходимые опции
      //определяем, куда выводить ошибки
      curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, errorBuffer);
      //задаем опцию - получить страницу по адресу [url]http://google.com[/url]
      curl_easy_setopt(curl, CURLOPT_URL, "google.com");
      //указываем прокси сервер
      //curl_easy_setopt(curl, CURLOPT_PROXY, "proxy:8080");
      //задаем опцию отображение заголовка страницы
      //curl_easy_setopt(curl, CURLOPT_HEADER, 1);
      //curl_easy_setopt(curl, CURLOPT_RETURNTRANSFER, 1);   // возвращает веб-страницу
      curl_easy_setopt(curl, CURLOPT_HEADER, 0);           // не возвращает заголовки
      curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1);   // переходит по редиректам
      curl_easy_setopt(curl, CURLOPT_ENCODING, "");        // обрабатывает все кодировки
      //curl_easy_setopt(curl, CURLOPT_USERAGENT, $uagent);  // useragent
      curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 120); // таймаут соединения
      curl_easy_setopt(curl, CURLOPT_TIMEOUT, 120);        // таймаут ответа
      curl_easy_setopt(curl, CURLOPT_MAXREDIRS, 10);       // останавливаться после 10-ого редиректа
 
      //указываем функцию обратного вызова для записи получаемых данных
      curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writer);
      //указываем куда записывать принимаемые данные
      curl_easy_setopt(curl, CURLOPT_WRITEDATA, &buffer);
      //запускаем выполнение задачи
      result = curl_easy_perform(curl);
      //проверяем успешность выполнения операции
      if (result == CURLE_OK)      
        {
         ofstream f("google.html");
         if(!f) { cout<<"Can't create file google.html"<<endl;return 0;}
         else   { f<<buffer<<endl; f.close();}  
        }
      else      
        //выводим сообщение об ошибке
        cout << "Ошибка! " << errorBuffer << endl;        
     }
  //завершаем сессию
  curl_easy_cleanup(curl);
  cout<<"Ok"<<endl;
  return 0;
}
Думаю для ознакомления можно даже использовать информацию для php версии :
http://wapinet.ru/textbook/CURL_in_PHP.htm
http://parsing-and-i.blogspot.... steps.html
0
Evg
Эксперт CАвтор FAQ
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
21.06.2012, 10:03 16
Цитата Сообщение от Avazart Посмотреть сообщение
Ошибка! Couldn't resolve proxy 'proxy'
Потому что прокси-сервер у тебя кривой задан был

Когда докопаешься до истины - можно и в блог выложить пример. Потому как основной массе людей, готовых самостоятельно разбираться, как правило достаточно одного примера, чтобы самостоятельно двигаться дальше

Добавлено через 2 минуты
Ну и для полноты картины я бы сначала показал код на чистом Си, а потом уже привинтил Си++-ные string'и. Сама технология передачи указателей на объекты Си++ через указатели функций библиотеки на Си для начинающих может показаться далеко не очевидной
0
0 / 0 / 0
Регистрация: 30.04.2020
Сообщений: 3
18.04.2024, 11:58 17
Добрый день!
Как в библиотеке задать ключ "-d" с параметрами?
0
18.04.2024, 11:58
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.04.2024, 11:58
Помогаю со студенческими работами здесь

Скачивание файл из интернета
Все добрый вечер. Имеется рабочий код, который скачивает файл AdbeRdr1001_en_US.exe с ссайта ...

Скачивание файла из интернета
Вопрос, как сделать так чтобы при нажатии на кнопку закачивался файл и процесс отображался на...

Скачивание файлов из интернета
Всем доброго времени суток! И с наступающим!) Итакс. Мне надо научить программу скачивать файл....

Скачивание файла из интернета
Нужно сделать скачивание файла с показателем прогресса и поддержкой докачки.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Как написать микросервис на Go/Golang с Kafka и GitHub CI/CD
InfoMaster 14.01.2025
Определение микросервиса, преимущества использования Go/ Golang Микросервис – это архитектурный подход к разработке программного обеспечения, при котором приложение состоит из небольших, независимо. . .
Как написать микросервис с нуля на C# с RabbitMQ, CQRS и CI/CD
InfoMaster 14.01.2025
В современном мире разработки программного обеспечения микросервисная архитектура стала стандартом де-факто для создания масштабируемых и гибких приложений. Этот архитектурный подход предполагает. . .
Как создать интернет-магазин на PHP и JavaScript
InfoMaster 14.01.2025
В современном мире электронная коммерция стала неотъемлемой частью бизнеса. Создание собственного интернет-магазина открывает широкие возможности для предпринимателей, позволяя достичь большей. . .
Как написать Тетрис на Ассемблере
InfoMaster 14.01.2025
Тетрис – одна из самых узнаваемых и популярных компьютерных игр, созданная в 1984 году советским программистом Алексеем Пажитновым. За прошедшие десятилетия она завоевала симпатии миллионы людей по. . .
Как создать игру "Танчики" на Unity3d и C#
InfoMaster 14.01.2025
Разработка игр – это увлекательный процесс, сочетающий в себе творчество и технические навыки. В этой статье мы рассмотрим создание классической игры "Танчики" с использованием Unity3D и языка. . .
Организую платный онлайн микро-курс по доработке Android-клиента Telegram
_Ivana 14.01.2025
Официальная версия и распространенные форки не полностью устраивают? Сделай свою кастомную версию клиента! 4 занятия по 2 часа (2 недели пн, ср 19:00-21:00 по Москве). Первое вводное занятие. . .
Как создать приложение для фитнеса для iOS/iPhone на Kotlin
InfoMaster 14.01.2025
Создание собственного фитнес-приложения — это не только захватывающий, но и полезный процесс, ведь оно может стать вашим верным помощником на пути к здоровому и активному образу жизни. В современных. . .
Как создать приложение магазина для iOS/iPhone на Swift
InfoMaster 14.01.2025
Введение в разработку iOS-приложений Разработка приложений для iPhone и других устройств на базе iOS открывает огромные возможности для создания инновационных мобильных решений. В данной статье мы. . .
Это работает. Скорость асинхронной логики велика. Вопрос видимо останется в стабильности. Плата - огонь!
Hrethgir 13.01.2025
По прошлому проекту в Logisim Evolution https:/ / www. cyberforum. ru/ blogs/ 223907/ blog8781. html прилагаю файл архива проекта в Gowin Eda. Восьмибитный счётчик из сумматора+ генератор сигнала. . .
UserScript для подсветки кнопок языков программировани­­­­я в зависимости от текущего раздела
volvo 13.01.2025
В результате работы этого скрипта подсвечиваются нужные кнопки не только в форме быстрого ответа, но и при редактировании сообщения: / / ==UserScript== / / @name CF_DefaultLangSelect / / . . .
Введение в модели и алгоритмы машинного обучения
InfoMaster 12.01.2025
Машинное обучение представляет собой одну из наиболее динамично развивающихся областей искусственного интеллекта, которая фокусируется на разработке алгоритмов и методов, позволяющих компьютерам. . .
Как на Python создать нейросеть для решения задач
InfoMaster 12.01.2025
В контексте стремительного развития современных технологий особое внимание уделяется таким инструментам, как нейросети. Эти структуры, вдохновленные биологическими нейронными сетями, используются для. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru