|
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
|
Так работает
|
|||
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-объектами. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |