Рекомендую: Фриланс-биржа | Кэшбэк-сервис | Интернет-бухгалтерия

Как скачать файл с интернета по HTTP средствами 1с 8

Предлагаю вашему вниманию функцию, позволяющую получить файл с интернета, в том числе, на которые установлен редирект.

&НаСервере
Процедура Пример()

ИмяФайла = ПолучитьФайлССервера(«http://www.1c.ru/ftp/pub/pricelst/price_1c.zip»);

КонецПроцедуры

&НаСервереБезКонтекста
Функция ПолучитьHTTPОтвет(ПутьКФайлуНаСервере, ИмяФайла, Соединение, Заголовки, флаг = Истина)

HTTPЗапрос = Новый HTTPЗапрос(ПутьКФайлуНаСервере, Заголовки);
HTTPЗапрос.Заголовки.Вставить(«Accept-Charset», «utf-8»);
HTTPОтвет = Соединение.Получить(HTTPЗапрос, ИмяФайла);

Если HTTPОтвет.КодСостояния = 301 или HTTPОтвет.КодСостояния = 302 Тогда
ПутьКФайлуНаСервере = HTTPОтвет.Заголовки[«Location»];
URLРазделенный = РазделитьURL(ПутьКФайлуНаСервере);
ПутьКФайлуНаСервере = URLРазделенный.ПутьКФайлуНаСервере;
HTTPОтвет = ПолучитьHTTPОтвет(ПутьКФайлуНаСервере, ИмяФайла, Соединение, Заголовки, Флаг);
КонецЕсли;

файл = Новый Файл(ИмяФайла);

Если флаг и HTTPОтвет.КодСостояния >= 200 и HTTPОтвет.КодСостояния <= 299 Тогда флаг = Ложь; ИмяФайлаВр = ПутьКФайлуНаСервере; Пока Найти(ИмяФайлаВр,»/») > 0 цикл
ИмяФайлаВр = Сред(ИмяФайлаВр,Найти(ИмяФайлаВр,»/»)+1);
КонецЦикла;
Если НЕ ПустаяСтрока(ИмяФайлаВр) Тогда
ПереместитьФайл(ИмяФайла, файл.Путь + ИмяФайлаВр);
ИмяФайла = файл.Путь + ИмяФайлаВр;
КонецЕсли;
КонецЕсли;

Возврат HTTPОтвет;

КонецФункции

&НаСервереБезКонтекста
Функция ПолучитьФайлССервера(ФайлНаВебСервере)

ВремКаталог = ПолучитьИмяВременногоФайла();
СоздатьКаталог(ВремКаталог);

ПараметрыПолученияФайлов = Новый Структура;

ПараметрыПолучения = Новый Структура(«ИмяФайла»);
ПараметрыПолучения. Вставить(«ИмяФайла», ВремКаталог);

URLРазделенный = РазделитьURL(ФайлНаВебСервере);

ИмяСервера = URLРазделенный.ИмяСервера;
ПутьКФайлуНаСервере = URLРазделенный.ПутьКФайлуНаСервере;
Протокол = URLРазделенный.Протокол;
Заголовки = Новый Соответствие;
СписокФайлов = новый Массив;

Соединение = Новый HTTPСоединение(ИмяСервера, , , , , , );

ИмяФайла = ВремКаталог + «\temp.htm»;

HTTPОтвет = ПолучитьHTTPОтвет(ПутьКФайлуНаСервере, ИмяФайла, Соединение, Заголовки);

Если HTTPОтвет.КодСостояния < 200 Или HTTPОтвет.КодСостояния >= 300 Тогда
ФайлОтвета = Новый ЧтениеТекста(ВремКаталог + «\temp.htm», КодировкаТекста.UTF8);
ВызватьИсключение СтроковыеФункцииКлиентСервер.ИзвлечьТекстИзHTML(ФайлОтвета.Прочитать(5 * 1024));
КонецЕсли;

Возврат ИмяФайла;

КонецФункции // ПолучитьФайлССервера()

&НаСервереБезКонтекста
Функция РазделитьURL(Знач URL) Экспорт

СтруктураURL = СтруктураURI(URL);

Результат = Новый Структура;
Результат.Вставить(«Протокол», ?(ПустаяСтрока(СтруктураURL.Схема), «http», СтруктураURL.Схема));
Результат.Вставить(«ИмяСервера», СтруктураURL.ИмяСервера);
Результат.Вставить(«ПутьКФайлуНаСервере», СтруктураURL.ПутьНаСервере);

Возврат Результат;

КонецФункции

&НаСервереБезКонтекста
Функция СтруктураURI(Знач СтрокаURI) Экспорт

СтрокаURI = СокрЛП(СтрокаURI);

// схема
Схема = «»;
Позиция = Найти(СтрокаURI, «://»);
Если Позиция > 0 Тогда
Схема = НРег(Лев(СтрокаURI, Позиция — 1));
СтрокаURI = Сред(СтрокаURI, Позиция + 3);
КонецЕсли;

// Строка соединения и путь на сервере.
СтрокаСоединения = СтрокаURI;
ПутьНаСервере = «»;
Позиция = Найти(СтрокаСоединения, «/»);
Если Позиция > 0 Тогда
ПутьНаСервере = Сред(СтрокаСоединения, Позиция + 1);
СтрокаСоединения = Лев(СтрокаСоединения, Позиция — 1);
КонецЕсли;

// Информация пользователя и имя сервера.
СтрокаАвторизации = «»;
ИмяСервера = СтрокаСоединения;
Позиция = Найти(СтрокаСоединения, «@»);
Если Позиция > 0 Тогда
СтрокаАвторизации = Лев(СтрокаСоединения, Позиция — 1);
ИмяСервера = Сред(СтрокаСоединения, Позиция + 1);
КонецЕсли;

// логин и пароль
Логин = СтрокаАвторизации;
Пароль = «»;
Позиция = Найти(СтрокаАвторизации, «:»);
Если Позиция > 0 Тогда
Логин = Лев(СтрокаАвторизации, Позиция — 1);
Пароль = Сред(СтрокаАвторизации, Позиция + 1);
КонецЕсли;

// хост и порт
Хост = ИмяСервера;
Порт = «»;
Позиция = Найти(ИмяСервера, «:»);
Если Позиция > 0 Тогда
Хост = Лев(ИмяСервера, Позиция — 1);
Порт = Сред(ИмяСервера, Позиция + 1);
КонецЕсли;

Результат = Новый Структура;
Результат.Вставить(«Схема», Схема);
Результат.Вставить(«Логин», Логин);
Результат.Вставить(«Пароль», Пароль);
Результат.Вставить(«ИмяСервера», ИмяСервера);
Результат.Вставить(«Хост», Хост);
Результат.Вставить(«Порт», ?(ПустаяСтрока(Порт), Неопределено, Число(Порт)));
Результат.Вставить(«ПутьНаСервере», ПутьНаСервере);

Возврат Результат;

КонецФункции

If you liked my post, feel free to subscribe to my rss feeds