diff --git a/OPI/src/CommonModules/OPI_GoogleDrive/Module.bsl b/OPI/src/CommonModules/OPI_GoogleDrive/Module.bsl index 6e16ed46552..f0e098abd41 100644 --- a/OPI/src/CommonModules/OPI_GoogleDrive/Module.bsl +++ b/OPI/src/CommonModules/OPI_GoogleDrive/Module.bsl @@ -174,12 +174,13 @@ // Получает файл по ID // // Параметры: -// Токен - Строка - Токен - token -// Идентификатор - Строка - Идентификатор файла - object +// Токен - Строка - Токен - token +// Идентификатор - Строка - Идентификатор файла - object +// ПутьСохранения - Строка - Путь сохранения файла - out // // Возвращаемое значение: -// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google -Функция СкачатьФайл(Знач Токен, Знач Идентификатор) Экспорт +// ДвоичныеДанные,Строка - двоичные данные или путь к файлу при указании параметра ПутьСохранения +Функция СкачатьФайл(Знач Токен, Знач Идентификатор, Знач ПутьСохранения = "") Экспорт OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен); OPI_ПреобразованиеТипов.ПолучитьСтроку(Идентификатор); @@ -190,7 +191,7 @@ Параметры = Новый Соответствие; Параметры.Вставить("alt", "media"); - Ответ = OPI_Инструменты.Get(URL, Параметры , Заголовки); + Ответ = OPI_Инструменты.Get(URL, Параметры , Заголовки, ПутьСохранения); Возврат Ответ; diff --git a/OPI/src/CommonModules/OPI_Инструменты/Module.bsl b/OPI/src/CommonModules/OPI_Инструменты/Module.bsl index 43de54c43bc..e817148a658 100644 --- a/OPI/src/CommonModules/OPI_Инструменты/Module.bsl +++ b/OPI/src/CommonModules/OPI_Инструменты/Module.bsl @@ -37,11 +37,11 @@ #Область ЗапросыБезТела -Функция Get(Знач URL, Знач Параметры = "", Знач ДопЗаголовки = "") Экспорт +Функция Get(Знач URL, Знач Параметры = "", Знач ДопЗаголовки = "", Знач ФайлОтвета = "") Экспорт Возврат ВыполнитьЗапросБезТела(URL, "GET", Параметры, ДопЗаголовки); КонецФункции -Функция Delete(Знач URL, Знач Параметры = "", Знач ДопЗаголовки = "") Экспорт +Функция Delete(Знач URL, Знач Параметры = "", Знач ДопЗаголовки = "", Знач ФайлОтвета = "") Экспорт Возврат ВыполнитьЗапросБезТела(URL, "DELETE", Параметры, ДопЗаголовки); КонецФункции @@ -49,16 +49,37 @@ #Область ЗапросыСТелом -Функция Post(Знач URL, Знач Параметры = "", Знач ДопЗаголовки = "", Знач JSON = Истина, Знач ПолныйОтвет = Ложь) Экспорт +Функция Post(Знач URL + , Знач Параметры = "" + , Знач ДопЗаголовки = "" + , Знач JSON = Истина + , Знач ПолныйОтвет = Ложь + , Знач ФайлОтвета = "") Экспорт + Возврат ВыполнитьЗапросСТелом(URL, "POST", Параметры, ДопЗаголовки, JSON, ПолныйОтвет); + КонецФункции -Функция Patch(Знач URL, Знач Параметры = "", Знач ДопЗаголовки = "", Знач JSON = Истина, Знач ПолныйОтвет = Ложь) Экспорт +Функция Patch(Знач URL + , Знач Параметры = "" + , Знач ДопЗаголовки = "" + , Знач JSON = Истина + , Знач ПолныйОтвет = Ложь + , Знач ФайлОтвета = "") Экспорт + Возврат ВыполнитьЗапросСТелом(URL, "PATCH", Параметры, ДопЗаголовки, JSON, ПолныйОтвет); + КонецФункции -Функция Put(Знач URL, Знач Параметры = "", Знач ДопЗаголовки = "", Знач JSON = Истина, Знач ПолныйОтвет = Ложь) Экспорт +Функция Put(Знач URL + , Знач Параметры = "" + , Знач ДопЗаголовки = "" + , Знач JSON = Истина + , Знач ПолныйОтвет = Ложь + , Знач ФайлОтвета = "") Экспорт + Возврат ВыполнитьЗапросСТелом(URL, "PUT", Параметры, ДопЗаголовки, JSON, ПолныйОтвет); + КонецФункции #КонецОбласти @@ -69,7 +90,8 @@ , Знач Параметры , Знач Файлы = "" , Знач ТипКонтента = "image/jpeg" - , Знач ДопЗаголовки = "") Экспорт + , Знач ДопЗаголовки = "" + , Знач ФайлОтвета = "") Экспорт Возврат ВыполнитьЗапросМультипарт(URL, "POST", Параметры, Файлы, ТипКонтента, ДопЗаголовки); @@ -79,18 +101,31 @@ , Знач Параметры , Знач Файлы = "" , Знач ТипКонтента = "image/jpeg" - , Знач ДопЗаголовки = "") Экспорт + , Знач ДопЗаголовки = "" + , Знач ФайлОтвета = "") Экспорт Возврат ВыполнитьЗапросМультипарт(URL, "PUT", Параметры, Файлы, ТипКонтента, ДопЗаголовки); КонецФункции -Функция PostMultipartRelated(Знач URL, Знач JSON = "", Знач Файлы = "", Знач ДопЗаголовки = "") Экспорт +Функция PostMultipartRelated(Знач URL + , Знач JSON = "" + , Знач Файлы = "" + , Знач ДопЗаголовки = "" + , Знач ФайлОтвета = "") Экспорт + Возврат ВыполнитьЗапросМультипартРелэйтед(URL, "POST", JSON, Файлы, ДопЗаголовки); + КонецФункции -Функция PatchMultipartRelated(Знач URL, Знач JSON = "", Знач Файлы = "", Знач ДопЗаголовки = "") Экспорт +Функция PatchMultipartRelated(Знач URL + , Знач JSON = "" + , Знач Файлы = "" + , Знач ДопЗаголовки = "" + , Знач ФайлОтвета = "") Экспорт + Возврат ВыполнитьЗапросМультипартРелэйтед(URL, "PATCH", JSON, Файлы, ДопЗаголовки); + КонецФункции #КонецОбласти @@ -103,6 +138,13 @@ Возврат; КонецЕсли; + ФайлТела = Ответ.ПолучитьИмяФайлаТела(); + + Если Не ФайлТела = Неопределено Тогда + Ответ = ФайлТела; + Возврат; + КонецЕсли; + GZip = "gzip"; НужнаРаспаковка = Ответ.Заголовки.Получить("Content-Encoding") = GZip @@ -334,7 +376,13 @@ #Область СлужебныеПроцедурыИФункции -Функция ВыполнитьЗапросСТелом(Знач URL, Знач Вид, Знач Параметры = "", Знач ДопЗаголовки = "", Знач JSON = Истина, Знач ПолныйОтвет = Ложь) +Функция ВыполнитьЗапросСТелом(Знач URL + , Знач Вид + , Знач Параметры = "" + , Знач ДопЗаголовки = "" + , Знач JSON = Истина + , Знач ПолныйОтвет = Ложь + , Знач ФайлОтвета = "") Если Не ЗначениеЗаполнено(Параметры) Тогда Параметры = Новый Структура; @@ -350,10 +398,16 @@ УстановитьТелоЗапроса(Запрос, Параметры, JSON); - Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос); + Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос, ФайлОтвета); Если ЭтоПереадресация(Ответ) Тогда - Ответ = ВыполнитьЗапросСТелом(Ответ.Заголовки["Location"], Вид, Параметры, ДопЗаголовки, JSON); + Ответ = ВыполнитьЗапросСТелом(Ответ.Заголовки["Location"] + , Вид + , Параметры + , ДопЗаголовки + , JSON + , ПолныйОтвет + , ФайлОтвета); Иначе ОбработатьОтвет(Ответ, ПолныйОтвет); КонецЕсли; @@ -362,7 +416,11 @@ КонецФункции -Функция ВыполнитьЗапросБезТела(Знач URL, Знач Вид, Знач Параметры = "", Знач ДопЗаголовки = "") +Функция ВыполнитьЗапросБезТела(Знач URL + , Знач Вид + , Знач Параметры = "" + , Знач ДопЗаголовки = "" + , Знач ФайлОтвета = "") Если Не ЗначениеЗаполнено(Параметры) Тогда Параметры = Новый Структура; @@ -374,10 +432,10 @@ Запрос = СоздатьЗапрос(Адрес, ДопЗаголовки); Соединение = СоздатьСоединение(Сервер); - Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос); + Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос, ФайлОтвета); Если ЭтоПереадресация(Ответ) Тогда - Ответ = ВыполнитьЗапросБезТела(Ответ.Заголовки["Location"], Вид, Параметры, ДопЗаголовки); + Ответ = ВыполнитьЗапросБезТела(Ответ.Заголовки["Location"], Вид, Параметры, ДопЗаголовки, ФайлОтвета); Иначе ОбработатьОтвет(Ответ); КонецЕсли; @@ -391,7 +449,8 @@ , Знач Параметры , Знач Файлы = "" , Знач ТипКонтента = "image/jpeg" - , Знач ДопЗаголовки = "") + , Знач ДопЗаголовки = "" + , Знач ФайлОтвета = "") Если Не ЗначениеЗаполнено(Параметры) Тогда Параметры = Новый Структура; @@ -414,7 +473,13 @@ Соединение = СоздатьСоединение(Сервер); ТелоЗапроса = ПолучитьИмяВременногоФайла(); - ЗаписьТекста = Новый ЗаписьДанных(ТелоЗапроса, КодировкаТекста.UTF8, ПорядокБайтов.LittleEndian, "", Ложь, "", Ложь); + ЗаписьТекста = Новый ЗаписьДанных(ТелоЗапроса + , КодировкаТекста.UTF8 + , ПорядокБайтов.LittleEndian + , "" + , Ложь + , "" + , Ложь); ЗаписатьПараметрыМультипарт(ЗаписьТекста, Boundary, Параметры); ЗаписатьФайлыМультипарт(ЗаписьТекста, Boundary, ТипКонтента, Файлы); @@ -424,7 +489,7 @@ Запрос.УстановитьИмяФайлаТела(ТелоЗапроса); - Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос); + Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос, ФайлОтвета); ЭтоПереадресация = Ответ.КодСостояния >= Переадресация И Ответ.КодСостояния < Ошибка; Если ЭтоПереадресация Тогда @@ -433,7 +498,8 @@ , Параметры , Файлы , ТипКонтента - , ДопЗаголовки); + , ДопЗаголовки + , ФайлОтвета); Иначе ОбработатьОтвет(Ответ); КонецЕсли; @@ -446,7 +512,12 @@ КонецФункции -Функция ВыполнитьЗапросМультипартРелэйтед(URL, Вид, JSON = "", Файлы = "", ДопЗаголовки = "") +Функция ВыполнитьЗапросМультипартРелэйтед(Знач URL + , Знач Вид + , Знач JSON = "" + , Знач Файлы = "" + , Знач ДопЗаголовки = "" + , Знач ФайлОтвета = "") Переадресация = 300; Ошибка = 400; @@ -461,7 +532,13 @@ Соединение = СоздатьСоединение(Сервер); ТелоЗапроса = ПолучитьИмяВременногоФайла(); - ЗаписьТекста = Новый ЗаписьДанных(ТелоЗапроса, КодировкаТекста.UTF8, ПорядокБайтов.LittleEndian, "", Ложь, "", Ложь); + ЗаписьТекста = Новый ЗаписьДанных(ТелоЗапроса + , КодировкаТекста.UTF8 + , ПорядокБайтов.LittleEndian + , "" + , Ложь + , "" + , Ложь); ЗаписатьJSONМультипарт(ЗаписьТекста, Boundary, JSON); ЗаписатьФайлыРелэйтед(ЗаписьТекста, Boundary, Файлы); @@ -473,11 +550,16 @@ Запрос.УстановитьИмяФайлаТела(ТелоЗапроса); - Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос); + Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос, ФайлОтвета); ЭтоПереадресация = Ответ.КодСостояния >= Переадресация И Ответ.КодСостояния < Ошибка; Если ЭтоПереадресация Тогда - Ответ = ВыполнитьЗапросМультипартРелэйтед(Ответ.Заголовки["Location"], "POST", JSON, Файлы, ДопЗаголовки); + Ответ = ВыполнитьЗапросМультипартРелэйтед(Ответ.Заголовки["Location"] + , Вид + , JSON + , Файлы + , ДопЗаголовки + , ФайлОтвета); Иначе ОбработатьОтвет(Ответ); КонецЕсли; diff --git a/cli/core/Classes/Приложение.os b/cli/core/Classes/Приложение.os index fc208d35f51..001e39455dd 100644 --- a/cli/core/Classes/Приложение.os +++ b/cli/core/Classes/Приложение.os @@ -283,13 +283,22 @@ СтандартнаяЕдиница = 1024; ЕдиницаДанных = СтандартнаяЕдиница * СтандартнаяЕдиница; + Значение = ?(ТипЗнч(Значение) = Тип("ДвоичныеДанные"), Значение, Строка(Значение)); Если ТипЗнч(Значение) = Тип("ДвоичныеДанные") Тогда Значение.Записать(Путь); Иначе - ТекстовыйДокумент = Новый ТекстовыйДокумент(); - ТекстовыйДокумент.УстановитьТекст(Значение); - ТекстовыйДокумент.Записать(Путь); + + ВозможныйФайл = Новый Файл(Значение); + + Если ВозможныйФайл.Существует() Тогда + Путь = Значение; + Иначе + ТекстовыйДокумент = Новый ТекстовыйДокумент(); + ТекстовыйДокумент.УстановитьТекст(Значение); + ТекстовыйДокумент.Записать(Путь); + КонецЕсли; + КонецЕсли; ЗаписанныйФайл = Новый Файл(Путь);