Функция ПередатьФайлВЯндексОблако(ФайлСсылка, КлассХранилища = "STANDARD") Экспорт
УстановитьПривилегированныйРежим(Истина);
ДД = ФайлСсылка.Данные.Получить();
Если ДД = Неопределено Тогда
Возврат "Нет данных для передачи";
КонецЕсли;
СтруктураСоединения = ПолучитьДанныеУчетнойЗаписи("ХраненияФайлов"); //Данные для подключения к Яндекс.Облаку хранятся в зашифрованных данных в ИБ, получаем ввиде структуры
СтруктураURI = СтруктураURI(СтруктураСоединения.Сервер);
Соединение = Новый HTTPСоединение(СокрЛП(СтруктураURI.Хост));
СтруктураСоединения.Вставить("Хост", СтруктураURI.Хост);
ИмяФайла = Строка(ФайлСсылка.УникальныйИдентификатор()) + "." + СокрЛП(ФайлСсылка.Расширение);
ОбъектХеш = Новый ХешированиеДанных(ХешФункция.SHA256);
ОбъектХеш.Добавить(ДД);
ХешСумма = ОбъектХеш.ХешСумма;
ХешДД = ПолучитьHexСтрокуИзДвоичныхДанных(ХешСумма);
CanonicalQueryString = НРег(ХешДД);
CanonicalURI = "/" + СтруктураСоединения.Бакет + "/" + СтруктураСоединения.АдресРесурса + "/" + КодироватьСтроку(ИмяФайла, СпособКодированияСтроки.URLВКодировкеURL);
ResourceAddress = "/" + СтруктураСоединения.Бакет + "/" + СтруктураСоединения.АдресРесурса + "/" + КодироватьСтроку(ИмяФайла, СпособКодированияСтроки.URLВКодировкеURL);
Данные = СформироватьДанныеДляЗапроса("PUT", ResourceAddress, CanonicalQueryString, CanonicalURI, СтруктураСоединения, КлассХранилища, ФайлСсылка);
Если Данные = Неопределено Тогда
Возврат "Ошибка формирования данных для запроса, проверьте заполнение настроек.";
КонецЕсли;
Authorization = СформироватьAuthorization(Данные);
Заголовки = Новый Соответствие;
Заголовки.Вставить("Authorization", Authorization);
Для каждого Строка Из Данные["CanonicalHeaders"] Цикл
Заголовки.Вставить(Строка.Ключ, Строка.Значение);
КонецЦикла;
Заголовки.Вставить("Content-Length", Формат(ДД.Размер(), "ЧГ="));
Если ФайлСсылка.ТипФайла = Перечисления.СР_ТипФайла.Видео Тогда
Если ВРег(СокрЛП(ФайлСсылка.Расширение)) = "MOV" Тогда
Заголовки.Вставить("Content-Type", "video/quicktime");
Иначе
Заголовки.Вставить("Content-Type", "video/" + СокрЛП(ФайлСсылка.Расширение));
КонецЕсли;
Иначе
Заголовки.Вставить("Content-Type", "image/jpeg");
КонецЕсли;
Запрос = Новый HTTPЗапрос(Данные["ResourceAddress"], Заголовки);
Запрос.УстановитьТелоИзДвоичныхДанных(ДД);
Ответ = Соединение.Записать(Запрос);
Если Ответ.КодСостояния = 200 Тогда
Попытка
Возврат Истина;
Исключение
Возврат ОписаниеОшибки();
КонецПопытки;
Иначе
Возврат Ответ.ПолучитьТелоКакСтроку();
КонецЕсли;
КонецФункции
Функция СформироватьДанныеДляЗапроса(HTTPМетод, ResourceAddress, CanonicalQueryString, CanonicalURI, СтруктураСоединения, КлассХранилища = Неопределено, ФайлСсылка = Неопределено)
УстановитьПривилегированныйРежим(Истина);
Данные = Новый Соответствие;
Данные.Вставить("host", СтруктураСоединения.Хост);
Данные.Вставить("Request", HTTPМетод);
Данные.Вставить("ResourceAddress", ResourceAddress);
Данные.Вставить("AccessKeyID", СтруктураСоединения.ИдентификаторКлюча);
Данные.Вставить("Region", "us-east-1");
Данные.Вставить("SecretAccessKey", СтруктураСоединения.СекретныйКлючДоступа);
Данные.Вставить("Folder", СтруктураСоединения.АдресРесурса);
Данные.Вставить("Algorithm", "AWS4-HMAC-SHA256");
Данные.Вставить("AWSSecretAccessKey", "AWS4" + СтруктураСоединения.СекретныйКлючДоступа);
Данные.Вставить("CanonicalQueryString", CanonicalQueryString);
Данные.Вставить("CanonicalURI", CanonicalURI);
ДатаЗапроса = ТекущаяУниверсальнаяДата();
Данные.Вставить("date", Формат(ДатаЗапроса, "ДФ=yyyyMMdd"));
Данные.Вставить("x-amz-date", Формат(ДатаЗапроса, "ДФ=yyyyMMddTHHmmssZ")); // ISO 8601 standard, and must be formatted with the "yyyyMMddTHHmmssZ"
Данные.Вставить("expiration-date", Формат(ДатаЗапроса, "ДФ=yyyy-MM-ddTHH:mm:ssZ"));
Данные.Вставить("x-amz-credential", Данные["AccessKeyID"] + "/" + Данные["date"] + "/" + Данные["Region"] + "/s3/aws4_request");
Данные.Вставить("x-amz-storage-class", КлассХранилища);
Данные.Вставить("x-amz-content-sha256", CanonicalQueryString);
ТаблицаЗаголовки = Новый ТаблицаЗначений;
ТаблицаЗаголовки.Колонки.Добавить("Заголовок");
ДобавитьЗаголовок(ТаблицаЗаголовки, "x-amz-date");
ДобавитьЗаголовок(ТаблицаЗаголовки, "host");
ДобавитьЗаголовок(ТаблицаЗаголовки, "x-amz-content-sha256");
ТаблицаЗаголовки.Сортировать("Заголовок");
CanonicalHeaders = Новый Соответствие;
Для каждого Строка Из ТаблицаЗаголовки Цикл
CanonicalHeaders.Вставить(Строка.Заголовок, Данные[Строка.Заголовок]);
КонецЦикла;
Данные.Вставить("CanonicalHeaders", CanonicalHeaders);
Возврат Данные;
КонецФункции
Функция СформироватьAuthorization(Данные)
Authorization = Новый Соответствие;
// Алгоритм, который использовался для вычисления подписи. Для AWS Signature Version 4 - AWS4-HMAC-SHA256
Authorization.Вставить("Algorithm", Данные["Algorithm"]); //
// Идентификатор ключа доступа и информацию о области видимости
Authorization.Вставить("Credential", Данные["AccessKeyID"] + "/" + Данные["date"] + "/" + Данные["Region"] + "/s3/aws4_request");
// Список заголовков запросов, разделенных точкой с запятой, которые используем для вычисления подписи, в нижнем регистре.
Authorization.Вставить("SignedHeaders", СформироватьSignedHeaders(Данные["CanonicalHeaders"]));
// 256-битная подпись, выраженная в виде 64 строчных шестнадцатеричных символов
Authorization.Вставить("Signature", СформироватьSignature(Данные));
СтрокаAuthorization =
Authorization["Algorithm"] + " " +
"Credential=" + Authorization["Credential"] + "," +
"SignedHeaders=" + Authorization["SignedHeaders"] + "," +
"Signature=" + Authorization["Signature"];
Возврат СтрокаAuthorization;
КонецФункции
0 Комментариев