|
v7: Декодировать большой файл из Base64 | ☑ | ||
---|---|---|---|---|
0
Volodja
25.10.22
✎
08:09
|
Написал такую функцию для декодирования Base64-файла в двоичный:
Функция глДекодироватьФайл_из_Base64(_Путь) Экспорт Если ФС.СуществуетФайл(_Путь)=0 Тогда Предупреждение("Не существует файл - "+_Путь); Возврат ""; КонецЕсли; objXML = CreateObject("MSXml2.DOMDocument"); objDocElem = objXML.createElement("tmp"); objDocElem.DataType = "bin.base64"; objStream = CreateObject("ADODB.Stream"); //objStream.Type = 1; //objStream.Mode = 3; objStream.Open(); objStream.LoadFromFile(_Путь); base64text=objStream.ReadText(); //олеШелл = СоздатьОбъект("MSScriptControl.ScriptControl"); //олеШелл.Language = "javascript"; //олеШелл.AddObject("objStream", objStream); //олеШелл.AddObject("objDocElem", objDocElem); //олеШелл.Eval("objDocElem.text = objStream.ReadText()"); objDocElem.text = base64text; objStream = CreateObject("ADODB.Stream"); objStream.Type = 1; objStream.Mode = 3; objStream.Open(); олеШелл = СоздатьОбъект("MSScriptControl.ScriptControl"); олеШелл.Language = "vbscript"; олеШелл.AddObject("objStream", objStream); олеШелл.AddObject("objDocElem", objDocElem); олеШелл.Eval("objStream.Write(objDocElem.NodeTypedValue)"); врмФайл=ПолучитьВременныйФайл("bin"); objStream.SaveToFile(врмФайл, 2); Возврат врмФайл; КонецФункции //********************* Если файл до 300KB, то все OK. А мне нужно декодировать файлы более 1MB Получив большой файл, 1С падает. Есть другой способ декодирования? Перепробовал несколько.Падает на всех известных мне. |
|||
1
Volodja
25.10.22
✎
08:17
|
(0) Падает на строке
objDocElem.text = base64text; |
|||
2
asady
25.10.22
✎
08:34
|
(0) MSXML 4.0 / 3.0 ???
|
|||
3
NorthWind
25.10.22
✎
08:40
|
(0) ну вот люди комстроковую утилиту нашли https://forum.script-coding.com/viewtopic.php?id=8594
|
|||
4
trad
25.10.22
✎
08:51
|
||||
5
Volodja
25.10.22
✎
09:00
|
(4) У меня запрос отрабатывает. я сохраняю полученный base64өфайл на диск. Он появляется
А при декодировании падает (2) objXML = CreateObject("Msxml2.DOMDocument.6.0"); Похоже, что шестая, объект так создается |
|||
6
trad
25.10.22
✎
09:02
|
(5) там про падение 1с при передаче длинной строки в комобъект и способ решение - oleexsup
|
|||
7
Volodja
25.10.22
✎
09:14
|
(6)
ЗагрузитьВнешнююКомпоненту("D:\1sb\DLL\OLEExSup.dll"); //Версия продукта 1.0.0.7 OleExSup = СоздатьОбъект("OLEExSup"); OleExSup.InvokeOLEMethod(objDocElem, "text", base64text); //*****************Выдал OleExSup.InvokeOLEMethod(objDocElem, "text", base64text); {Глобальный модуль(6021)}: 0x80020003 : Член группы не найден. Как правильно вызвать? |
|||
8
Volodja
25.10.22
✎
09:20
|
(7) Вернее 1.0.0.7- это версия файла
Версия продукта - 1.0.0.0 |
|||
9
asady
25.10.22
✎
09:32
|
(0) Здесь смотрел?
https://dml.compkaluga.ru/forum/index.php?showtopic=73815 |
|||
10
trad
25.10.22
✎
09:33
|
.text - это не метод, а свойство
из документации к oleexsup Класс OLEExSup :: УстановитьСвойство / PutProperty Синтаксис: УстановитьСвойство(ОЛЕОбъект, Свойство, Значение) Параметры: ОЛЕОбъект - объект реализующий интерфейс IDispatch Свойство - тип: Строка, название свойства ОЛЕ-объекта Значение - тип: Любой, значение свойства объекта Описание: Выполняет установку значения свойства через интерфейс IDispatch. |
|||
11
Volodja
25.10.22
✎
09:52
|
(10) Спасибо. Хелп тоже нашел
Блин теперь если беру объект: objXML = CreateObject("MSXml2.DOMDocument.6.0"); ОлеШелл.Eval("objStream.Write(objDocElem.NodeTypedValue)"); {Глобальный модуль(6036)}: msxml6.dll: Параметр задан неверно А если objXML = CreateObject("MSXml2.DOMDocument"); То ругается что нет свойства OleExSup.PutProperty(objDocElem, "text", base64text); {D:\1SB\EXTFORMS\TEST_BASE64.ERT(67)}: 0x80004005 : Неопознанная ошибка |
|||
12
Volodja
25.10.22
✎
10:03
|
(10) Вернее ругается, что со свойством что-то не так
OleExSup.PutProperty(objDocElem, "text", base64text); {D:\1SB\EXTFORMS\TEST_BASE64.ERT(67)}: 0x80004005 : Неопознанная ошибка Возникает также, если файл большой. Если до 300KB , то все ОК |
|||
13
trad
25.10.22
✎
10:19
|
(12) скорее всего в base64text не base64
|
|||
14
Volodja
25.10.22
✎
10:27
|
(13) Я его в этом формате получаю запросом. Заявлено, что Base64
|
|||
15
trad
25.10.22
✎
10:29
|
вот это добавь
objStream.Charset = "windows-1251"; |
|||
16
Volodja
25.10.22
✎
10:37
|
(15) Нарыл, что на боьшом файле выдает абракадабру. На малых, до 300KB, нормально
objStream = CreateObject("ADODB.Stream"); objStream.Open(); objStream.LoadFromFile(_Путь); base64text=objStream.ReadText(); Сообщить(Лев(base64text,30)); Сообщить(Прав(base64text,30)); |
|||
17
trad
25.10.22
✎
10:38
|
протестировал - работает
objXML = CreateObject("MSXml2.DOMDocument"); objDocElem = objXML.createElement("tmp"); objDocElem.DataType = "bin.base64"; objStream = CreateObject("ADODB.Stream"); objStream.Charset = "windows-1251"; objStream.Open(); objStream.LoadFromFile("d:\test.txt"); base64text = objStream.ReadText(); Сообщить(Лев(base64text, 100)); OleExSup = СоздатьОбъект("OLEExSup"); OleExSup.PutProperty(objDocElem, "text", base64text); Сообщить(Лев(objDocElem.text, 100)); в test.txt base64 размером 1.5мб |
|||
18
Volodja
25.10.22
✎
10:38
|
(15)
objStream.Charset = "windows-1251"; И на малых с этим пургу стал выдывать |
|||
19
trad
25.10.22
✎
10:39
|
+ проверь чтобы в файле не было BOM
|
|||
20
trad
25.10.22
✎
10:40
|
(18) файл-то в какой кодировке хоть?
|
|||
21
Volodja
25.10.22
✎
10:42
|
(20) А на большом нормально выдает с objStream.Charset = "windows-1251";
|
|||
22
Volodja
25.10.22
✎
10:46
|
Сохранял малые Base так
objStream = CreateObject("ADODB.Stream"); //objStream.Type = 2; //objStream.Mode = 3; objStream.Open(); objStream.WriteText(textBase64); objStream.SaveToFile(врмФайл, 2); NotePad++ показывает, что кодировка UTF 16 c BOM Спасибо.Сейчас без BOM сделаю |
|||
23
Volodja
25.10.22
✎
11:03
|
Спасибо, Trad. Все получилось с вашей OLEExSup.dll
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |