Имя: Пароль:
1C
1С v8
Как определить расширение файла при загрузке через 1С?
,
0 anchar007
 
25.06.19
09:41
Всем доброго дня!
Из 1С на клиенте пытаюсь сохранить файл во временные файлы по ссылке вида: https://mydomen.com/load_file.php?upload_file_id=2437114
Сохраняю так:
ИмяВременногоФайла = ПолучитьИмяВременногоФайла(РасширениеФайла);
КопироватьФайл("https://mydomen.com/load_file.php?upload_file_id=2437114",ИмяВременногоФайла);

Но этот код работает только тогда, когда расширение файла заранее известно, а если не известно, то сохраняется файл с расширением tmp.
Если поменять расширение этого временного файла (например на png) то открывается картинка. Проблема в том, что по ссылке может быть не только png.
К примеру браузер по этой ссылке сразу предлагает загрузить картинку с расширением png, т.е. он перед загрузкой каким-то образом анализирует файл. Как сделать то же самое из 1С?
1 ДенисЧ
 
25.06.19
09:49
Через копироватьФайл - никак.
Если только через magic определять. А если надо - читай средствами HTTP, там есть X-Application, в котором идёт тип файла
2 anchar007
 
25.06.19
09:53
(1) magic - это что?
3 Вафель
 
25.06.19
09:59
делай через http соединение.
анализируй заголовки
4 anchar007
 
25.06.19
10:33
Спасибо!

Если вдруг кому-нибудь понадобится:

Из переменной Результат можно распарсить расширение:
У меня Результат.Заголовки.Получить("Content-Type") это строка "image/jpg"


&НаКлиенте
Процедура ПолучитьФайлПоСсылке()
    
    СтруктураURI = СтруктураURI("https://mydomen.com/load_file.php?upload_file_id=2437114";);
    ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL();
    HTTPСоединение = Новый HTTPСоединение(СтруктураURI.Хост,СтруктураURI.Порт,,,,30,ЗащищенноеСоединение,ЛОЖЬ);
    
    HTTPЗапрос = Новый HTTPЗапрос(СтруктураURI.ПутьНаСервере);
    
    Попытка
        Результат = HTTPСоединение.Получить(HTTPЗапрос);
    Исключение
        Сообщить("Произошла сетевая ошибка!");
    КонецПопытки;
    
КонецПроцедуры



&НаКлиенте
Функция СтруктураURI(Знач СтрокаURI) Экспорт
    
    СтрокаURI = СокрЛП(СтрокаURI);
    
    // схема
    Схема = "";
    Позиция = Найти(СтрокаURI, "://");
    Если Позиция > 0 Тогда
        Схема = НРег(Лев(СтрокаURI, Позиция - 1));
        СтрокаURI = Сред(СтрокаURI, Позиция + 3);
    КонецЕсли;

    // строка соединения и путь на сервере
    СтрокаСоединения = СтрокаURI;
    ПутьНаСервере = "";
    Позиция = Найти(СтрокаСоединения, "/");
    Если Позиция > 0 Тогда
        ПутьНаСервере = Сред(СтрокаСоединения, Позиция + 1);
        СтрокаСоединения = Лев(СтрокаСоединения, Позиция - 1);
    КонецЕсли;
        
    // информация пользователя и имя сервера
    СтрокаАвторизации = "";
    ИмяСервера = СтрокаСоединения;
    Позиция = Найти(СтрокаСоединения, "@");
    Если Позиция > 0 Тогда
        СтрокаАвторизации = Лев(СтрокаСоединения, Позиция - 1);
        ИмяСервера = Сред(СтрокаСоединения, Позиция + 1);
    КонецЕсли;
    
    // логин и пароль
    Логин = СтрокаАвторизации;
    Пароль = "";
    Позиция = Найти(СтрокаАвторизации, ":");
    Если Позиция > 0 Тогда
        Логин = Лев(СтрокаАвторизации, Позиция - 1);
        Пароль = Сред(СтрокаАвторизации, Позиция + 1);
    КонецЕсли;
    
    // хост и порт
    Хост = ИмяСервера;
    Порт = "";
    Позиция = Найти(ИмяСервера, ":");
    Если Позиция > 0 Тогда
        Хост = Лев(ИмяСервера, Позиция - 1);
        Порт = Сред(ИмяСервера, Позиция + 1);
    КонецЕсли;
    
    Результат = Новый Структура;
    Результат.Вставить("Схема", Схема);
    Результат.Вставить("Логин", Логин);
    Результат.Вставить("Пароль", Пароль);
    Результат.Вставить("ИмяСервера", ИмяСервера);
    Результат.Вставить("Хост", Хост);
    Результат.Вставить("Порт", ?(Порт <> "", Число(Порт), Неопределено));
    Результат.Вставить("ПутьНаСервере", ПутьНаСервере);
    
    Возврат Результат;
    
КонецФункции