Вход | Регистрация

1С:Предприятие :: 1С:Предприятие 7.7 и ранее

v7: Сохранить файл картинки по ссылке

v7: Сохранить файл картинки по ссылке
Я
   dimm7310
 
20.11.18 - 10:03
Задача по данным файла xls создавать новую номенклатуру, все ок, кроме сохранения фото по ссылке с сайта (авторизации нет)

пробовал так:
[code/]

  WinHttp = Создатьобъект("WinHttp.WinHttpRequest.5.1"); //WinHttpRequest

    
    WinHttp.Open("GET", "http://www.toool.ru/img_resized/850_640/136/136397/00000030236_430045106050.jpg";, 0);
    WinHttp.Send();
    Если WinHttp.Status = 200 Тогда
        Stream = СоздатьОбъект("ADODB.Stream");

        Stream.Type = 1;
        Stream.Mode = 3;

        Stream.Open();
        Stream.Write(WinHttp.responseBody);
        Stream.SaveToFile("f:\00000030236_430045106050.jpg", 2);
        Stream.Close();
        Stream = "";
    Иначе
        //Сообщить("HTTP " + WinHttp.Status + " " + WinHttp.StatusText);
        //Возврат;
    КонецЕсли;

[/code]
 
 
   dimm7310
 
1 - 20.11.18 - 10:04
ругается Stream.Write(WinHttp.responseBody)   }: Тип переменой не поддерживается
   dimm7310
 
2 - 20.11.18 - 10:04
киньте примером
   Lexey_
 
3 - 20.11.18 - 10:08
(0) в данном случае сработает КопироватьФайл("http://www.toool.ru/img_resized/850_640/136/136397/00000030236_430045106050.jpg";, <Приемник>);
   dimm7310
 
4 - 20.11.18 - 10:12
Я забыл упомянуть речь про 1С 7.7
   dimm7310
 
5 - 20.11.18 - 10:13
В 8ке, да это работает, а в 7ке 
ФС.КопироватьФайл("http://www.toool.ru/img_resized/850_640/136/136397/00000030236_430045106050.jpg","f:\00000030236_430045106050.jpg",1);

- ничего не происходит
   dimm7310
 
6 - 20.11.18 - 10:23
Соединение= СоздатьОбъект("AddIn.V7HttpReader");
Соединение.ПолучитьКакФайл("http://www.toool.ru/img_resized/850_640/136/136397/00000030236_430045106050.jpg","f:\00000030236_430045106050.jpg";);

так работает, но нет поддержки https
   MadDAD
 
7 - 20.11.18 - 11:44
А если взять WinHttp.ResponseStream? Тут пишут, что это IStream - https://docs.microsoft.com/en-us/windows/desktop/winhttp/iwinhttprequest-responsestream
   MadDAD
 
8 - 20.11.18 - 11:49
Или BinaryData из 1С++ ?
   MadDAD
 
9 - 20.11.18 - 12:12
Так работает


    WinHttp = Создатьобъект("WinHttp.WinHttpRequest.5.1"); //WinHttpRequest
    WinHttp.Open("GET", "http://www.toool.ru/img_resized/850_640/136/136397/00000030236_430045106050.jpg";, 0);
    WinHttp.Send();

    Если WinHttp.Status = 200 Тогда
        Scr = СоздатьОбъект("MSScriptControl.ScriptControl");
        Scr.Language = "vbscript";
        ТекстМодуля = "
        |Sub SaveToFile(ByRef FileName, ByRef WinHttp)
        |    Set Stream = CreateObject(""ADODB.Stream"")
        |    Stream.Type = 1
        |    Stream.Mode = 3
        |    Stream.Open
        |    Stream.Write WinHttp.responseBody
        |    Stream.SaveToFile FileName, 2
        |    Stream.Close
        |End Sub";
        
        Scr.AddCode(ТекстМодуля);
        Scr.Run("SaveToFile","f:\00000030236_430045106050.jpg",WinHttp);
    Иначе
        //Сообщить("HTTP " + WinHttp.Status + " " + WinHttp.StatusText);
        //Возврат;
    КонецЕсли;

   Злопчинский
 
10 - 21.11.18 - 05:44
так тоже работает

//....

    Попытка
        httpRequest     = СоздатьОбъект("winhttp.winhttprequest.5.1");
        
        stream             = СоздатьОбъект("adodb.stream");
        stream.type     = 1;//adTypeBinary;

        stream.open();
        
        script             = СоздатьОбъект("ScriptControl");
        script.language = "jscript";
        script.addObject("httpRequest"    ,httpRequest);
        script.addObject("stream"        ,stream);
        
    Исключение
        Сообщить("> "+лПуть+лИмя+": неудачная попытка создания управляющих сценариев для загрузки файлов...","i");
        Сообщить("> "+СимволТабуляции+"|_ "+ОписаниеОшибки(),"i");
        Сообщить("> "+СимволТабуляции+"|_ загрузка файла(ов) отменена...","i");
        Возврат;
    КонецПопытки;    
//...

//...
        ИмяФайла = ПапкаКартинок+ТекФайл;
        Состояние("запрос "+урл_АдресЗагрузки+ТекФайл);
        
        Попытка 
            httpRequest.open("GET",урл_АдресЗагрузки+ТекФайл,);
            httpRequest.send();
            Ответ = httpRequest.Status;
        Исключение
            Сообщить("> неудачная попытка запроса на загрузку файла...","i");
            Сообщить("> "+СимволТабуляции+"|_ "+ОписаниеОшибки(),"i");
            Продолжить;
        КонецПопытки;
        
        КодОтвета = Число(Ответ);
        Если  КодОтвета = 200
        Тогда ЗагруженоУспешно=ЗагруженоУспешно+1;
        Иначе 
            Если  Режим = 1
            Тогда Сообщить("> |_ запрос файла "+урл_АдресЗагрузки+ТекФайл+", ответ: "+Ответ);                
            КонецЕсли;    
            Продолжить;
        КонецЕсли;
        
        script.eval("stream.write(httpRequest.responseBody);");
        stream.saveToFile(ПапкаКартинок+ТекФайл, 2);//adSaveCreateOverWrite
 
 Рекламное место пустует
   BalBess
 
11 - 21.11.18 - 08:32
Проще и правильнее все делать в одном скрипте
Примерно так

//******************************************* 

Функция ВыполнитьСкрипт(Скрипт)
    Попытка
    ScrptCtrl=СоздатьОбъект("MSScriptControl.ScriptControl");
        ScrptCtrl.Language="vbscript";
        ScrptCtrl.AddCode(Скрипт);
        Возврат ScrptCtrl.Run("RunScript");
    Исключение
        Сообщить("" + ОписаниеОшибки());
        Возврат ОписаниеОшибки();
    КонецПопытки;    
КонецФункции
//******************************************* 



    Скрипт = "
        |Function RunScript()
        |    Set httpRequest = CreateObject(""WinHttp.WinHttpRequest.5.1"")
        |    httpRequest.SetTimeouts 120000,1200000,1200000,1200000
            |    httpRequest.Open
        |    httpRequest.SetCredentials 
        |    httpRequest.Option 2,""utf-8""
           |    httpRequest.setrequestheader 
         |
           |    httpRequest.Send 
 
        |    Select Case httpRequest.Status 
        |    Case 200 
            |        Dim Stream
        |        Set Stream = CreateObject(""ADODB.Stream"")
        |        Stream.Type = 1
        |        Stream.Mode = 3
 
        |        Stream.Open
        |        Stream.Write httpRequest.ResponseBody
        |        Stream.SaveToFile 
        |        Stream.Close
       
//          |        strInfo = httpRequest.ResponseText

          |        strInfo = httpRequest.Status
        |    Case Else 
        |        strInfo = httpRequest.StatusText
        |    End Select
        |    RunScript = strInfo
        |End Function";    
    
        Ответ = ВыполнитьСкрипт(Скрипт);




А то получается мешанина из 1с и скриптом
только нужно внимательно составить скрипт, там кавычки важны, заголовки и т.д.
   MadDAD
 
12 - 21.11.18 - 10:50
(11) Если требуется только скачать файл то да. Если предполагаются еще какие-то действия с соединением тогда вынести в скрипт только то что нельзя сделать непосредственно на 1С.
   BalBess
 
13 - 22.11.18 - 08:50
Как-раз наоборот, если только получить небольшой файл, то можно по вашему. Если предполагаются более серьезные вещи, то все скриптом.
Объект WinHttpRequest в 1С имеет ограничения на отправку и получение, по моему не более 300кБ
Попробуйте вашим скриптом отправить или получить файл 1Гб
   trad
 
14 - 22.11.18 - 09:43
можно всего вот этого не делать
Set Stream = CreateObject(""ADODB.Stream"")
Stream.Type = 1
Stream.Mode = 3
Stream.Open
Stream.Write WinHttp.responseBody
Stream.SaveToFile FileName, 2

если применить более современный объект
WinHttp = Создатьобъект("Msxml2.ServerXMLHTTP");

а в скрипте написать сразу так
WinHttp.responseStream.SaveToFile FileName, 2
   trad
 
15 - 22.11.18 - 09:46
туплю
в WinHttpRequest responseStream тоже есть (там нет responseXML)
тогда любой можно WinHttpRequest или ServerXMLHTTP
   MadDAD
 
16 - 22.11.18 - 16:36
(15) Неа, так не работает.

Попробовал только что и через скрипт, и напрямую с обоими COM-объектами.

Список тем форума
Рекламное место пустует  Рекламное место пустует
Миста — веселый ресурс со своими эксклюзивными тараканами Ymryn
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Рекламное место пустует