Проверить существование файла на http

1. lisa-alisa 27.05.16 12:53 Сейчас в теме
Подскажите как проверить существование файла на http? Через Файл.Существует и НайтиФайлы не получается.
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. nickpugachev 27.05.16 13:02 Сейчас в теме
через HttpСоединение
Ответ с кодом, отличным от 200 - файла нет по тому адресу, который указан
3. lisa-alisa 27.05.16 14:12 Сейчас в теме
(2) nickpugachev, а можно пример кода. Что-то не могу разобраться.
4. Frogger1971 27.05.16 15:50 Сейчас в теме
// Возвращает содержимое ответа HTTP-сервера, полученного методом GET, в виде строки или двоичных данных
// ** Coded by Sergey (aka Porutchik) * 2014 http://forum.aeroion.ru/cat1.html
//
// Параметры
//  СерверПриемник - <Строка> - доменное имя сервера или полный адрес (url) запрашиваемой ссылки.
//                        Может включать протокол (http://, https://) и порт.
//  АдресСтраницы - <Строка> - опционально. Адрес страницы на сервере без протокола (http://, https://),
//                        доменного имени сервера (хоста) и порта.
//                Если не указано, адрес страницы будет извлечён из параметра СерверПриемник
//  ПараметрыСоединения - <Структура> - опционально. Структура, содержащая дополнительные параметры для HTTPСоединение.
//                Назначение ключей:
//                Логин или Пользователь - Тип Строка - Имя пользователя на указанном сервере.
//                Пароль - Тип Строка - Пароль пользователя на указанном сервере.
//                Прокси - Тип ИнтернетПрокси - Прокси, используемый для соединения с сервером.
//                Таймаут - Тип Число - Таймаут осуществляемого соединения и операций, в секундах. 0 - не устанавливать таймаут..
//  ЗаголовкиHTTP  - <Соответствие> - опционально.
//                Заголовки, которые будут отправлены на сервер в виде соответствия: "Заголовок" - "Значение".
//                Если указано, функция возвратит в программу заголовки HTTP-ответа с кодом состояния в ключе StatusCode,
//                имя файла в ключе FileName, url-кодированное имя в ключе EncodeFileName
//  ПолучитьКакДвоичныеДанные - <Булево> - опционально. Определяет, в каком виде получить содержимое ответа сервера
//                            По умолчанию Ложь.
//  ЗащищенноеСоединение - <Булево> - опционально. По умолчанию Ложь.
//                            Если Истина, соединение будет происходить по протоколу https://
//
// Возвращаемое значение:
//   <Строка>, <ДвоичныеДанные> - содержимое ответа сервера, если ресурс найден по указанному адресу.
//
Функция ПолучитьСодержимоеВебАдреса(Знач СерверПриемник, Знач АдресСтраницы = "",
                Знач ПараметрыСоединения = Неопределено, ЗаголовкиHTTP = Неопределено,
                Знач ПолучитьКакДвоичныеДанные = Ложь, Знач ЗащищенноеСоединение = Ложь) Экспорт
    Перем ИмяФайлаОтветаКодированное, ИмяФайлаОтвета, Порт, Логин, Пользователь, Пароль, Прокси, Таймаут;

    Если Не ЗначениеЗаполнено(СерверПриемник) Тогда Возврат Неопределено; КонецЕсли;
    Если ТипЗнч(ЗаголовкиHTTP) <> Тип("Соответствие") Тогда ЗаголовкиHTTP = Новый Соответствие; КонецЕсли;
    Если Найти(Нрег(СерверПриемник), "https://") = 1 Тогда ЗащищенноеСоединение = Истина; КонецЕсли;

    Протокол = ?(Найти(Нрег(СерверПриемник), "https://") = 1 ИЛИ ЗащищенноеСоединение, "https://", "http://");
    Если Лев(НРег(СерверПриемник), СтрДлина(Протокол)) = Протокол Тогда
        СерверПриемник = Сред(СерверПриемник, СтрДлина(Протокол) + 1);
    КонецЕсли;

    Если НЕ ЗначениеЗаполнено(АдресСтраницы) Тогда
        Позиция = Найти(СерверПриемник, "/");
        Если Позиция > 0 Тогда
            АдресСтраницы = Сред(СерверПриемник, Позиция, СтрДлина(СерверПриемник));
            СерверПриемник = Лев(СерверПриемник, Позиция - 1);
        Иначе
            АдресСтраницы = "/";
        КонецЕсли;
    КонецЕсли;

    СерверПриемник = СтрЗаменить(СерверПриемник, "/", "");

    //Выделяем порт из доменного имени
    ПозицияДвоеточия = Найти(СерверПриемник, ":");
    Если ПозицияДвоеточия > 0 Тогда
        Порт = Число(Сред(СерверПриемник, ПозицияДвоеточия + 1));
        СерверПриемник = Лев(СерверПриемник, ПозицияДвоеточия - 1);
    КонецЕсли;

    Если ТипЗнч(ПараметрыСоединения) = Тип("Структура") Тогда
        Для каждого КлючЗначение из ПараметрыСоединения Цикл
            Значение = КлючЗначение.Значение; Выполнить(КлючЗначение.Ключ + " = Значение;");
        КонецЦикла;
        Пользователь = ?(ЗначениеЗаполнено(Пользователь), Пользователь, Логин);
    КонецЕсли;
    НТТР = Новый HTTPСоединение(СерверПриемник, Порт, Пользователь, Пароль, Прокси, Таймаут,
                        ?(ЗащищенноеСоединение, Новый ЗащищенноеСоединениеOpenSSL(), Неопределено));

    //Ответ от сервера получим в возвращаемом значении типа HTTPОтвет
    ОтветHTTP = НТТР.Получить(Новый HTTPЗапрос(АдресСтраницы, ЗаголовкиHTTP)); //
    ОшибкаЗапроса = (ОтветHTTP.КодСостояния >= 400);

    //После получения ответа сервера необходимо проверить статус или код состояния.
    //http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
    //Если сервер вернул один из статусов переадресации
    //301 Moved Permanently («перемещено навсегда») или 302 Moved Temporarily («перемещено временно»),
    //то в этом случае можно попытаться перейти на ресурс, на который переадресовал сервер
    Если ОтветHTTP.КодСостояния = 301 или ОтветHTTP.КодСостояния = 302 Тогда

        Если ОтветHTTP.Заголовки.Количество() > 0 Тогда
            //Адрес страницы переадресации содержится в поле Location заголовка ответа
            АдресСтраницы = ОтветHTTP.Заголовки["Location"]; //
            Если ЗначениеЗаполнено(АдресСтраницы) Тогда
                Если Найти(НРег(АдресСтраницы), "http://") = 0 И Найти(НРег(АдресСтраницы), "https://") = 0 Тогда
                    АдресСтраницы = ?(Лев(АдресСтраницы, 1) = "/", Сред(АдресСтраницы, 2), АдресСтраницы);
                    Если Найти(АдресСтраницы, СерверПриемник + "/") = 0  Тогда
                        АдресСтраницы = Протокол + СерверПриемник + ?(ЗначениеЗаполнено(Порт), ":" + Порт, "") + "/" + АдресСтраницы;
                    КонецЕсли;
                КонецЕсли;

                //Если сервер вернул cookies (http://ru.wikipedia.org/wiki/HTTP_cookie, http://www.faqs.org/rfcs/rfc6265.html?#41;,
                //вставим их в заголовки для передачи на страницу перехода
                Куки = ОтветHTTP.Заголовки["Set-Cookie"];//
                Если ЗначениеЗаполнено(Куки) Тогда ЗаголовкиHTTP.Вставить("Cookie", Куки); КонецЕсли;

                //Рекурсивный вызов
                Возврат ПолучитьСодержимоеВебАдреса(АдресСтраницы, , , ЗаголовкиHTTP, ПолучитьКакДвоичныеДанные, ЗащищенноеСоединение);//

            КонецЕсли;
        КонецЕсли;

    ИначеЕсли ОтветHTTP.КодСостояния >= 100 И ОтветHTTP.КодСостояния <= 200 Тогда
        //Статус ответа в интервале между 100 и 200 Ok говорит о нормальном результате HTTP-запроса
        Если ОтветHTTP.Заголовки.Количество() > 0 Тогда
            ТипСодержимого = ОтветHTTP.Заголовки["Content-Type"];
            //http://ru.wikipedia.org/wiki/Список_MIME-типов
            Если Найти(ТипСодержимого, "text/") = 1 ИЛИ Найти(ТипСодержимого, "/javascript")
                ИЛИ Найти(ТипСодержимого, "+xml") ИЛИ Найти(ТипСодержимого, "/xml") <> 0 ИЛИ Найти(ТипСодержимого, "/json") <> 0 Тогда
                ПолучитьКакДвоичныеДанные = Ложь;
            ИначеЕсли Найти(ТипСодержимого, "image/") = 1 ИЛИ Найти(ТипСодержимого, "video/") = 1 
                ИЛИ Найти(ТипСодержимого, "application/") = 1 ИЛИ Найти(ТипСодержимого, "audio/") = 1 Тогда
                //Если содержимое полученного ответа представляет собой изображение, видео, приложение,
                //возвращаем двоичные данные, так как возвращать в виде строки не имеет смысла.
                ПолучитьКакДвоичныеДанные = Истина;
            КонецЕсли;
            //Некоторые сервера возвращают в типе содержимого имя отданного файла, например image/png; name="Имя файла.png"
            //или отдают в заголовке Content-Disposition: attachment; filename=Имя файла.png (http://www.http11.ru/post.php?post=2)
            Если ОтветHTTP.Заголовки["Content-Disposition"] <> Неопределено Тогда
                ТипСодержимого = ОтветHTTP.Заголовки["Content-Disposition"];
            КонецЕсли;
            ТипСодержимого = СтрЗаменить(СтрЗаменить(ТипСодержимого, """", ""), "'", "");

            //в ключе filename*=UTF-8'' содержится url-кодированное имя файла
            ПозицияИмениФайла = Найти(ТипСодержимого, "filename*=UTF-8");
            Если ПозицияИмениФайла <> 0 Тогда
                ИмяФайлаОтветаКодированное = Сред(ТипСодержимого, ПозицияИмениФайла + СтрДлина("filename*=UTF-8"));
                ПозицияДвоеточия = Найти(ИмяФайлаОтветаКодированное, ";");
                Если ПозицияДвоеточия <> 0 Тогда
                    ИмяФайлаОтветаКодированное = Лев(ИмяФайлаОтветаКодированное, ПозицияДвоеточия - 1);
                КонецЕсли;
            КонецЕсли;

            //в ключе filename= содержится обычное имя файла
            ПозицияИмениФайла = Найти(ТипСодержимого, "name=");
            Если ПозицияИмениФайла <> 0 Тогда
                ИмяФайлаОтвета = Сред(ТипСодержимого, ПозицияИмениФайла + СтрДлина("name="));
                ПозицияДвоеточия = Найти(ИмяФайлаОтвета, ";");
                Если ПозицияДвоеточия <> 0 Тогда
                    ИмяФайлаОтвета = Лев(ИмяФайлаОтвета, ПозицияДвоеточия - 1);
                КонецЕсли;
            КонецЕсли;
        КонецЕсли;
    КонецЕсли;

    ЗаголовкиHTTP = ОтветHTTP.Заголовки;
    //Добавляем в заголовки ответа код состояния (ответа) HTTP-сервера и имя файла содержимого, если есть.
    ЗаголовкиHTTP.Вставить("StatusCode", ОтветHTTP.КодСостояния);
    Если ЗначениеЗаполнено(ИмяФайлаОтвета) Тогда ЗаголовкиHTTP.Вставить("FileName", ИмяФайлаОтвета); КонецЕсли;
    Если ЗначениеЗаполнено(ИмяФайлаОтветаКодированное) Тогда
        ЗаголовкиHTTP.Вставить("EncodeFileName", ИмяФайлаОтветаКодированное);
    КонецЕсли;

    Если ОшибкаЗапроса ИЛИ НЕ ПолучитьКакДвоичныеДанные Тогда Возврат ОтветHTTP.ПолучитьТелоКакСтроку(); КонецЕсли;
    Возврат ОтветHTTP.ПолучитьТелоКакДвоичныеДанные();

КонецФункции // ПолучитьСодержимоеВебАдреса()

Показать


изучи, поймешь
5. nickpugachev 27.05.16 16:40 Сейчас в теме
Соединение = Новый HttpСоединение("www.gde.to");
Запрос = Новый HttpЗапрос("/тут/лежит/файл.jpg");
Ответ = Соединение.Получить(Запрос);
Если Ответ.КодСостояния=200 Тогда
  Сообщить("Файл есть!");
КонецЕсли;
ВИЛенин; +1 Ответить
6. ётун 27.05.16 16:47 Сейчас в теме
(5) nickpugachev, то есть, если я хочу проверить существование файла размером пару гигабайт, я должен его скачать целиком. Спасибо большое!
13. ВИЛенин 2 23.11.21 06:16 Сейчас в теме
(5) Как ни странно но файл у меня выложен по пути, а Ответ приходит в состоянии 301. И я стопорюсь. что дальше делать?)
15. nickpugachev 20.12.21 16:24 Сейчас в теме
(13) код 301 означает, что файл перемещен. в ответе будет новый путь для получения файла
7. ётун 27.05.16 16:54 Сейчас в теме
На чистом 1С такое недостижимо.
Необходимо отправлять на сервер запрос HEAD при помощи каких нибудь XMLHttpRequest, COM-объектов, внешних утилит, компонент и т.п...
8. AllexSoft 27.05.16 17:17 Сейчас в теме
(7) ётун, ну это зря вы так
Соединение = Новый HttpСоединение("www.gde.to");
Запрос = Новый HttpЗапрос("/тут/лежит/файл.jpg");
Ответ = Соединение.ПолучитьЗаголовки(Запрос);


без загрузки файла получит код 200 (вернее тип HTTPОтвет, там есть свойства Заголовки и КодСостояния)
Itilive.ru; a.kapustin; +2 Ответить
9. ётун 27.05.16 17:53 Сейчас в теме
(8) AllexSoft, да действительно, что-то я отстал от жизни 8.3, спасибо.
Ну оно собственно это и делает - HEAD запрос. Надо только грамотно обработать все 300 коды и не посчитать, что 403 - это отсутствие файла. Ну и т.п.
10. S1231833 29.05.16 15:50 Сейчас в теме
Ну зачем-же качать файл. Можно просто проверить есть или нет, и не зависимо от размера файла.

Попытка
Сервер = Новый FTPСоединение(ФТПСервер, , ПользовательФТП, ПарольФТП, , ПассивныйРежим, ) ;
Исключение
Предупреждение("Ошибка соединения с ФТП ");
Возврат;
КонецПопытки;

КаталогСервер = Сервер.ТекущийКаталог();

Если Сервер.НайтиФайлы(КаталогСервер+"/путь/где/файл/123.jpg").Количество() = 0 тогда
// нет файла
Иначе
// есть файл
КонецЕсли;
Показать
11. ётун 29.05.16 16:22 Сейчас в теме
(10) S1231833, скажите, а с какой версии 1C FTPСоединение начало корректно работать с HTTP протоколом, о котором спрашивают в (0)? Они уже исправили эту ошибку?
12. ZloyProger 8 19.02.20 07:43 Сейчас в теме
Доброго времени суток, Коллеги.
Прошу прощения за некропостинг.. Не кидайтесь только валенками сразу пожалуйста, я вообще смутно представляю себе веб-программирование (в далёком 2004 году в универе в блокноте сайтики а-ля хелло ворлд на лабараторках не в счёт...), но не могу понять ЧЯДНТ:
Соединение = Новый HttpСоединение("https://моякомпания.ru");
Запрос = Новый HttpЗапрос("/browse/DIVITT01TO5-676");
Ответ = Соединение.Получить(Запрос);

падает с ошибкой не могу разобрать адрес, хотя в браузере адрес страницы https://моякомпания.ru/browse/DIVITT01TO5-676
Пробовал вместо слеша %2F (HttpЗапрос("/browse%2FDIVITT01TO5-676");) - не помогло, куда ещё копать?
14. ВИЛенин 2 23.11.21 06:22 Сейчас в теме
Может вдруг кому надо ещё.
Я сделал как советовали на Мисте и всё зашло. Фотки лежали на яндекс диске. Спасибо им за код!

WinHttp =Новый COMОбъект("WinHttp.WinHttpRequest.5.1");
 
WinHttp.Open("GET","http://192.168.5.78/reports/report1508.xls\",0);
 
WinHttp.Send();
 
Статус = WinHttp.Status;
 
Если Статус = 200 Тогда
 
   Сообщить("Файл существует");
 
Иначе
 
   Сообщить("Файл не существует");
 
КонецЕсли;
Показать
16. Sashares 33 20.12.21 17:21 Сейчас в теме
(14)
WinHttp.Open("GET","http://192.168.5.78/reports/report1508.xls\",0);

А зачем в пути символ "\"?
17. ВИЛенин 2 21.12.21 05:41 Сейчас в теме
(16) Это по ошибки. И Кстати код не всегда находит картинки. в ответе иногда появляются чужие картинки, которые никак не связаны.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот