diff --git a/OPI/src/CommonModules/OPI_GoogleDrive/Module.bsl b/OPI/src/CommonModules/OPI_GoogleDrive/Module.bsl index 13ba3b0353..cb8511f9f0 100644 --- a/OPI/src/CommonModules/OPI_GoogleDrive/Module.bsl +++ b/OPI/src/CommonModules/OPI_GoogleDrive/Module.bsl @@ -539,15 +539,13 @@ СоответствиеФайла = Новый Соответствие; Если ЗначениеЗаполнено(Файл) Тогда - - OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Файл); + + РазмерЧасти = 268435457; + Размер = OPI_Инструменты.ПреобразоватьДанныеСПолучениемРазмера(Файл, РазмерЧасти); + СоответствиеФайла.Вставить(Файл, MIME); - Размер = Файл.Размер(); - РазмерЧасти = 268435456; - РазмерЧасти = РазмерЧасти + 1; - - Если Размер < РазмерЧасти Тогда + Если Размер < РазмерЧасти И ТипЗнч(Файл) = Тип("ДвоичныеДанные") Тогда Ответ = ЗагрузитьМалыйФайл(ОписаниеJSON, СоответствиеФайла, Заголовки, Идентификатор); Иначе Ответ = ЗагрузитьБольшойФайл(Описание, СоответствиеФайла, Заголовки, Идентификатор); @@ -615,11 +613,12 @@ ТекущаяПозиция = 0; ОбщийРазмер = Двоичные.Размер(); СтрОбщийРазмер = OPI_Инструменты.ЧислоВСтроку(ОбщийРазмер); + ЧтениеДанных = Новый ЧтениеДанных(Двоичные); + ИсходныйПоток = ЧтениеДанных.ИсходныйПоток(); Пока ПрочитаноБайт < ОбщийРазмер Цикл - - ЧтениеДанных = Новый ЧтениеДанных(Двоичные); - ПрочитаноБайт = ЧтениеДанных.Пропустить(ТекущаяПозиция); + + ПрочитаноБайт = ИсходныйПоток.ТекущаяПозиция(); Результат = ЧтениеДанных.Прочитать(РазмерЧасти); ТекущиеДанные = Результат.ПолучитьДвоичныеДанные(); РазмерТекущих = ТекущиеДанные.Размер(); diff --git a/OPI/src/CommonModules/OPI_Инструменты/Module.bsl b/OPI/src/CommonModules/OPI_Инструменты/Module.bsl index e6c11dc594..2ad213032a 100644 --- a/OPI/src/CommonModules/OPI_Инструменты/Module.bsl +++ b/OPI/src/CommonModules/OPI_Инструменты/Module.bsl @@ -385,6 +385,40 @@ КонецФункции +Функция ПреобразоватьДанныеСПолучениемРазмера(Данные, Знач МинимальныйРазмерДляПотока = 0) Экспорт + + Размер = 0; + + Если ТипЗнч(Данные) = Тип("Строка") Тогда + + ФайлНаДиске = Новый Файл(Данные); + + Если ФайлНаДиске.Существует() Тогда + Размер = ФайлНаДиске.Размер(); + Иначе + OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Данные); + Размер = Данные.Размер(); + КонецЕсли; + + Иначе + OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Данные); + Размер = Данные.Размер(); + КонецЕсли; + + Если ЗначениеЗаполнено(МинимальныйРазмерДляПотока) Тогда + Если Размер < МинимальныйРазмерДляПотока Тогда + OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Данные); + Иначе + OPI_ПреобразованиеТипов.ПолучитьДвоичныеИлиПоток(Данные); + КонецЕсли; + Иначе + OPI_ПреобразованиеТипов.ПолучитьДвоичныеИлиПоток(Данные); + КонецЕсли; + + Возврат Размер; + +КонецФункции + Процедура ЗначениеВМассив(Значение) Экспорт Значение_ = Новый Массив; diff --git a/OPI/src/CommonModules/OPI_ПреобразованиеТипов/Module.bsl b/OPI/src/CommonModules/OPI_ПреобразованиеТипов/Module.bsl index 99278e7add..f2c8e522dc 100644 --- a/OPI/src/CommonModules/OPI_ПреобразованиеТипов/Module.bsl +++ b/OPI/src/CommonModules/OPI_ПреобразованиеТипов/Module.bsl @@ -50,13 +50,8 @@ Значение = Новый ДвоичныеДанные(Значение); ИначеЕсли СтрНайти(Значение, "//") Тогда - - ИВФ = ПолучитьИмяВременногоФайла(); - КопироватьФайл(Значение, ИВФ); - - Значение = Новый ДвоичныеДанные(ИВФ); - - УдалитьФайлы(ИВФ); + + Значение = OPI_Инструменты.Get(Значение); Иначе @@ -72,6 +67,27 @@ КонецПроцедуры +Процедура ПолучитьДвоичныеИлиПоток(Значение) Экспорт + + Если Значение = Неопределено Тогда + Возврат; + КонецЕсли; + + Если ТипЗнч(Значение) <> Тип("Строка") Тогда + ПолучитьДвоичныеДанные(Значение); + Возврат; + КонецЕсли; + + Файл = Новый Файл(Значение); + + Если Файл.Существует() Тогда + Значение = Новый ФайловыйПоток(Значение, РежимОткрытияФайла.Открыть, ДоступКФайлу.Чтение); + Иначе + ПолучитьДвоичныеДанные(Значение); + КонецЕсли; + +КонецПроцедуры + Процедура ПолучитьКоллекцию(Значение) Экспорт Если Значение = Неопределено Тогда