Имя: Пароль:
1C
 
(1С PUT) Загрузка на яндекс диск командой PUT из 1С
0 assest
 
08.12.15
11:23
Метод КопироватьФайл() перестал работать на яндекс-диске
Поэтому я сново возвращаюсь к впоросу загрузки на ЯД методоми WebDav
Вот код из 1С

Путь = "D:\Новая папка\1.txt";          
Файл = Новый Файл(Путь);
    
Токен = "Мой токен";
Соединение = новый HTTPСоединение("webdav.yandex.ru",443,,,,,Новый ЗащищенноеСоединениеOpenSSL);     //cloud-api.yandex.net
Заголовки = Новый Соответствие;
Заголовки.Вставить("Accept","*/*");
Заголовки.Вставить("Authorization", "OAuth "+Токен);
Заголовки.Вставить("Etag",   ХЕШMD5 (Путь));
Заголовки.Вставить("Sha256", ХЕШ    (Путь));
Заголовки.Вставить("Content-Type", "text/html; charset=UTF-8");
Заголовки.Вставить("Expect", "100-continue");
    
Запрос = Новый HTTPЗапрос("/catalog/",Заголовки); // HTTP/1.1
Запрос.УстановитьТелоИзСтроки(Base64Строка(Новый ДвоичныеДанные(Путь)));                                                                    
Ответ = Соединение.ВызватьHTTPМетод("PUT", Запрос);
Сообщить( Ответ.КодСостояния );
//------------------------------------------------------
Что перехватывает фидлер

PUT https://webdav.yandex.ru/catalog/ HTTP/1.1
User-Agent: 1C+Enterprise/8.3
Host: webdav.yandex.ru
Content-Type: text/html; charset=UTF-8
Expect: 100-continue
Etag: C4 CA 42 38 A0 B9 23 82 0D CC 50 9A 6F 75 84 9B
Sha256: 6B 86 B2 73 FF 34 FC E1 9D 6B 80 4E FF 5A 3F 57 47 AD A4 EA A2 2F 1D 49 C0 1E 52 DD B7 87 5B 4B
Authorization: OAuth Мой токен
Accept: */*
Content-Length: 7

?MQ==
HTTP/1.1 405 Method Not Allowed
Yandex-Cloud-Request-ID: dav-DN2B_23B_GQ-1-webdav4h
Server: MochiWeb/1.0
Keep-Alive: timeout=300
Date: Tue, 08 Dec 2015 07:54:32 GMT
Content-Length: 33

Cannot perform PUT on collection
1 assest
 
08.12.15
11:27
Код возврта 405, указанный клиентом метод нельзя применить к текущему ресурсу. В руководстве разработчика для Яндекс диска(https://api.yandex.ru/disk/doc/dg/yandex-disk-dg.pdf) описан метод PUT
2 Garykom
 
гуру
08.12.15
11:30
Выкинуть эту каку... юзать FTP в вариациях
3 assest
 
08.12.15
11:35
(2) Здесь стоит вопрос как заставить это работать, а не какой выбрать ресурс для хранения данных
4 assest
 
08.12.15
11:35
Может кто-нибудь на вскидку видит ошибку в моем запросе или коде
5 Seducer
 
08.12.15
11:44
Вроде в демке БСП 2.3.2 есть пример работы с яндекс.диском
6 vhl
 
08.12.15
11:45
(4) Написано же: PUT /a/otpusk.avi
а ты что делаешь?
7 vhl
 
08.12.15
11:47
Я думаю надо: Запрос = Новый HTTPЗапрос("/catalog/1.txt",Заголовки);
8 assest
 
08.12.15
11:48
(7) А адрес сервера как передать?
9 assest
 
08.12.15
11:49
Вопрос снят
10 assest
 
08.12.15
12:00
PUT https://webdav.yandex.ru/catalog/1.txt HTTP/1.1
User-Agent: 1C+Enterprise/8.3
Host: webdav.yandex.ru
Content-Type: text/html; charset=UTF-8
Expect: 100-continue
Etag: C4 CA 42 38 A0 B9 23 82 0D CC 50 9A 6F 75 84 9B
Sha256: 6B 86 B2 73 FF 34 FC E1 9D 6B 80 4E FF 5A 3F 57 47 AD A4 EA A2 2F 1D 49 C0 1E 52 DD B7 87 5B 4B
Authorization: OAuth МойТокен
Accept: */*
Content-Length: 7

?MQ==
HTTP/1.1 400 Bad Request
Yandex-Cloud-Request-ID: dav-DN2h_42W_4PE-1-webdav6j
Server: MochiWeb/1.0
Keep-Alive: timeout=300
Date: Tue, 08 Dec 2015 08:59:32 GMT
Content-Length: 0
(7)вот это выглядит ошибка таже
11 mistеr
 
08.12.15
12:17
(4) Ошибку тебе сказали: "Cannot perform PUT on collection". URL неверный.
12 mistеr
 
08.12.15
12:18
(10) Ошибка другая.
13 mistеr
 
08.12.15
12:24
(12) Какие-то параметры неверные. Размер точно 7?
14 Урудук
 
08.12.15
12:51
ИмяФайла = "pppp.dbf";
    
    ЛокальныйПуть = "C:\1sbases\";
    
    // Задаем логин и пароль
    Логин = "login";
    Пароль = "password";
    
    //Пишем его в файл, чтобы потом закодировать
    ИмяФайлаТокен = ПолучитьИмяВременногоФайла();
    ФайлТокен = Новый ЗаписьТекста(ИмяФайлаТокен,"windows-1251");
    ФайлТокен.Записать(Логин+":"+Пароль);
    ФайлТокен.Закрыть();
    
    // Кодируем пароль в Base64
    ДвоичныйТокен = Новый ДвоичныеДанные(ИмяФайлаТокен);
    Токен = Base64Строка(ДвоичныйТокен);
    //и удаляем временный файл
    УдалитьФайлы(ИмяФайлаТокен);
    

    // Получение файла с сервера
        x = Новый ComОбъект("Microsoft.XMLHTTP");
        x.Open("GET","https://webdav.yandex.ru/"+ИмяФайла,0);  // третий параметр: 0-синхронный запрос, 1 - асинхронный
        x.setRequestHeader("Host", "webdav.yandex.ru");
        x.setRequestHeader("Accept", "*/*");
        x.setRequestHeader("Authorization", "Basic "+Токен);
        //x.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=windows-1251");
        //x.setRequestHeader("Content-Type", "text/plain; charset=windows-1251");
        x.Send();
        
        s = Новый ComОбъект("ADODB.Stream");
        s.Mode = 3;
        s.Type = 1;
        s.Open();
        s.Write(x.responseBody);
        s.SaveToFile(ЛокальныйПуть+ИмяФайла, 2);
    
    // Передача файла на сервер
        x = Новый ComОбъект("Microsoft.XMLHTTP");
        x.Open("PUT","https://webdav.yandex.ru/"+ИмяФайла,0);  // третий параметр: 0-синхронный запрос, 1 - асинхронный
        x.setRequestHeader("Host", "webdav.yandex.ru");
        x.setRequestHeader("Accept", "*/*");
        x.setRequestHeader("Authorization", "Basic "+Токен);
        
        s = Новый ComОбъект("ADODB.Stream");
        s.Mode = 3;
        s.Type = 1;
        s.Open();
        s.LoadFromFile(ЛокальныйПуть+ИмяФайла);    
        x.Send(s.Read());
15 assest
 
08.12.15
13:03
(13) Размер присваивает сама 1С, так что точный
16 assest
 
08.12.15
13:14
(14) Это попытка подключить яндекс диск?
17 Урудук
 
08.12.15
13:14
(16)
18 Урудук
 
08.12.15
13:15
да
19 ЧеловекДуши
 
08.12.15
13:21
(18) У вас приятный метод :)
20 assest
 
08.12.15
14:22
(18) Конфигурация будет использоваться на многих компах, и не хотелось бы подключать ЯД
21 Serginio1
 
08.12.15
14:43
Можно просто копировать
Путь1 = "https://login:[email protected]/path/to/file.txt";;
Путь2 = "c:\file.txt";
КопироватьФайл(Путь1, Путь2);
УдалитьФайлы(Путь1);
КопироватьФайл(Путь2, Путь1);


Удалить файла с Яндекс-диска из 1C
22 assest
 
08.12.15
14:58
(21) Яндекс больше не поддерживает эту функцию
23 vhl
 
08.12.15
15:08
(10) у тебя на яндекс диске папка то "catalog" есть?
24 Урудук
 
08.12.15
15:45
(20) Нет, Вы не поняли. Клиент ЯД ставить не надо. Мой код - прямое подключение к ЯД.
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn