|
v7: Загрузка файла на Yandex.Disk с помощью XMLHttpRequest | ☑ | ||
---|---|---|---|---|
0
Damash
28.03.22
✎
09:29
|
Требуется реализовать функционал загрузки файлов на Yandex.Disk
https://yandex.ru/dev/disk/api/reference/upload.html в ступор стал именно в момент уже конкретно отправки каким образом присоединяется сам файл при отправке методом PUT? Процедура глЗагрузитьОбновитьФайлНаЯндексДиске(token, УрлКYandexDisk, overwrite, ПутьКФайлуДляЗагрузки) Экспорт httpobj=CreateObject("winhttp.winhttprequest.5.1"); httpobj.Open("GET",УрлКYandexDisk,0); httpobj.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); httpobj.setRequestHeader("Authorization","OAuth " + token); httpobj.Send(""); Сообщить("1: "+УрлКYandexDisk); // папка на Я.Диске, куда требуется закачка Сообщить("2: "+httpobj.status+":"+httpobj.statusText); Текст=0; Текст=СоздатьОбъект("Текст"); Текст=httpobj.ResponseText; Текст=СтрЗаменить(Текст,"{""href"":""h","h"); ТехУрл=СтрЗаменить(Текст,"""}",""); Сообщить("3: "+ТехУрл); //технический url для закачки на Я.Диск ФС.УстТекКаталог("d:\"); НашФайл=ФС.НайтиПервыйФайл("sale.jpg"); **как присоединить к отправке? httpobj.Open("PUT",ТехУрл,0); httpobj.Send(); Сообщить("4: "+httpobj.status+":"+httpobj.statusText); Сообщить("5: "+httpobj.ResponseText); //ответ о результате закачки httpobj=0; КонецПроцедуры |
|||
1
MWWRuza
гуру
28.03.22
✎
10:02
|
Эээ... Я наверное что-то не понимаю... А можно пояснить, зачем такие сложности? Зачем вообще API в данном случае?
В ЯндексДиске Можно подключить его папку как локальный ресурс и просто копировать/заменять/удалять на нем файлы... У меня так обмен удаленных магазинов фронт <=> бэк сделан и работает, относительно стабильно, и уже давно. Вот, три магазина(их папки обмека) как с центрального компьютера выглядят: https://content.foto.my.mail.ru/mail/m_w_w/_mypagephoto/i-432.jpg |
|||
2
Damash
28.03.22
✎
11:36
|
1C на удаленном сервере крутится, как такового файлового обмена и работы с файлами там нет.
Решил, что API будет быстрее, глядя на описание от Яндекс. А так получается нужно на сервер залить прогу от Яндекса и дополнительно автообмен настроить. |
|||
3
acht
28.03.22
✎
12:14
|
(0) на vbs это примерно так:
Const adTypeBinary = 1 Set request = CreateObject("WinHttp.WinHttpRequest") Set dataStream = CreateObject("ADODB.Stream") dataStream.Type = adTypeBinary dataStream.Open dataStream.LoadFromFile "C:\path\to\your.file" request.Open "PUT", "http://your/url" request.SetRequestHeader "Content-Type", "application/octet-stream" request.Send dataStream |
|||
4
vladmenleo
28.03.22
✎
12:21
|
(Функция глЗагрузитьНаВебДав(ФайлИсточник, ИмяКаталога, ИмяФайла) Экспорт
x = СоздатьОбъект("Microsoft.XMLHTTP"); x.Open("PUT","http://User:password@addresWebDav/" + ИмяКаталога + ИмяФайла,0); // третий параметр: 0-синхронный запрос, 1 - асинхронный PUT x.setRequestHeader("Accept", "*/*"); x.setRequestHeader("Content-Type","application/binary"); Скрипт = СоздатьОбъект("MSScriptControl.ScriptControl"); Скрипт.language = "vbscript"; Stream = СоздатьОбъект("ADODB.Stream"); Stream.Mode = 3; Stream.Type = 1; Stream.Open(); Stream.LoadFromFile(ФайлИсточник); Скрипт.AddObject("s", Stream); Скрипт.AddObject("x", x); Скрипт.Eval("x.Send(s.Read())"); Stream.Close(); Возврат x.Status; КонецФункции // ЗагрузитьНаВебДав) Допили под себя имя пользователя, пароль имя ресурса подставь свои |
|||
5
acht
28.03.22
✎
12:23
|
(4) > Скрипт = СоздатьОбъект("MSScriptControl.ScriptControl");
Это зачем? |
|||
6
vladmenleo
28.03.22
✎
12:26
|
(5) вот для этого
Скрипт.AddObject("s", Stream); Скрипт.AddObject("x", x); Скрипт.Eval("x.Send(s.Read())"); Stream.Close(); |
|||
7
acht
28.03.22
✎
12:35
|
(6) А без него?
dataStream = СоздатьОбъект("ADODB.Stream") dataStream.Type = 1; dataStream.Open(); dataStream.LoadFromFile(ФайлИсточник); request = СоздатьОбъект("WinHttp.WinHttpRequest") request.Open("PUT", "http://your/url"); request.SetRequestHeader("Content-Type", "application/octet-stream") request.Send(dataStream); |
|||
8
vladmenleo
28.03.22
✎
12:45
|
(7) даже и не знаю. x.Send(Stream.Read()) без MSScriptControl.ScriptControl у меня не взлетело. я привел свою реально работающую сейчас функцию. Дальше что хочешь делай
|
|||
9
acht
28.03.22
✎
12:50
|
(8) Ох уж эти суровые семерочники, не желающие ни в чем разбираться...
|
|||
10
timurhv
28.03.22
✎
13:03
|
(2)
>Решил, что API будет быстрее, глядя на описание от Яндекс. Порежут скорость https://www.synology-forum.ru/index.php?/topic/10138--/ |
|||
11
Злопчинский
28.03.22
✎
13:51
|
а что на Ядиск заливать планируется?
не проще куда-нить на ФТП? |
|||
12
Damash
28.03.22
✎
14:02
|
(3)(7) ок, спасибо
буду пробовать! |
|||
13
Damash
28.03.22
✎
14:08
|
(7) спасибо, всё полетело.
итоговая процедура: Процедура глЗагрузитьОбновитьФайлНаЯндексДиске(token, УрлКYandexDisk, overwrite, ПутьКФайлуДляЗагрузки) Экспорт httpobj=CreateObject("winhttp.winhttprequest.5.1"); httpobj.Open("GET",УрлКYandexDisk,0); httpobj.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); httpobj.setRequestHeader("Authorization","OAuth " + token); httpobj.Send(""); Сообщить("1: "+УрлКYandexDisk); // папка на Я.Диске, куда требуется закачка Сообщить("2: "+httpobj.status+":"+httpobj.statusText); Текст=0; Текст=СоздатьОбъект("Текст"); Текст=httpobj.ResponseText; Текст=СтрЗаменить(Текст,"{""href"":""h","h"); ТехУрл=СтрЗаменить(Текст,"""}",""); Сообщить("3: "+ТехУрл); //технический url для закачки на Я.Диск dataStream = СоздатьОбъект("ADODB.Stream"); dataStream.Type = 1; dataStream.Open(); dataStream.LoadFromFile(ПутьКФайлуДляЗагрузки); httpobj.Open("PUT",ТехУрл,0); httpobj.SetRequestHeader("Content-Type", "application/octet-stream"); httpobj.Send(dataStream); Сообщить("4: "+httpobj.status+":"+httpobj.statusText); Сообщить("5: "+httpobj.ResponseText); //ответ о результате закачки httpobj=0; КонецПроцедуры |
|||
14
kupec
28.03.22
✎
19:30
|
А что такое token?
|
|||
15
MWWRuza
гуру
28.03.22
✎
20:23
|
Токен - это строка символов, которая получается после авторизации через API по логину/паролю или как на некоторых сайтах(например, ЧЗ) по ЭЦП. Имеет какой-то ограниченный срок жизни, и используется в запросах, что-бы каждый раз логин/пароль/ЭЦП "не светить" - несколько утрированно объяснил, но по сути примерно так.
Кстати, вопрос к ТС - а не поделитесь процедуркой/функцией под 7.7 для получения токена ЯД - ? Вроде как сейчас и не надо, но... А вдруг понадобится? :-) |
|||
16
stix2010
28.03.22
✎
21:33
|
(1) скорее всего файлы маленькие? 50 мб так не пройдет
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |