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

- ничего не происходит
6 dimm7310
 
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
7 MadDAD
 
20.11.18
11:44
А если взять WinHttp.ResponseStream? Тут пишут, что это IStream - https://docs.microsoft.com/en-us/windows/desktop/winhttp/iwinhttprequest-responsestream
8 MadDAD
 
20.11.18
11:49
Или BinaryData из 1С++ ?
9 MadDAD
 
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
11 BalBess
 
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с и скриптом
только нужно внимательно составить скрипт, там кавычки важны, заголовки и т.д.
12 MadDAD
 
21.11.18
10:50
(11) Если требуется только скачать файл то да. Если предполагаются еще какие-то действия с соединением тогда вынести в скрипт только то что нельзя сделать непосредственно на 1С.
13 BalBess
 
22.11.18
08:50
Как-раз наоборот, если только получить небольшой файл, то можно по вашему. Если предполагаются более серьезные вещи, то все скриптом.
Объект WinHttpRequest в 1С имеет ограничения на отправку и получение, по моему не более 300кБ
Попробуйте вашим скриптом отправить или получить файл 1Гб
14 trad
 
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
15 trad
 
22.11.18
09:46
туплю
в WinHttpRequest responseStream тоже есть (там нет responseXML)
тогда любой можно WinHttpRequest или ServerXMLHTTP
16 MadDAD
 
22.11.18
16:36
(15) Неа, так не работает.

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