Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/52: Рейтинг темы: голосов - 52, средняя оценка - 4.83
2 / 2 / 0
Регистрация: 03.08.2010
Сообщений: 16
1
.NET 4.x

Загрузка фото Вконтакте C# с авторизацией через oauth+api.vkontakte

25.05.2011, 10:17. Показов 10583. Ответов 3
Метки нет (Все метки)

Всем привет, прошу помощи, т.к. мозги уже кипят, и какие маны курить уже не знаю.
Есть внешнее desktop приложение на C# с авторизацией через oauth, нужно залить фото в созданный альбом.
Действую по рекомендованной здесь http://vkontakte.ru/developers... 0%EA%F2%E5 схеме.
1. Выполняю photos.getUploadServer, получаю upload_url
2. формирую POST запрос на полученный адрес, и здесь спотыкаюсь, всегда в ответе возвращается пустое поле "photos_list": "", что делает невозможным переход к третьему шагу (photos.save)

На втором шаге считываю изображение test.jpg в массив byte[] album_pic и ставлю его в POST
Что делаю не так? Вот код:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
private string VkUploadPhoto()
{
try
{
    WebResponse result = null;
    Stream ReceiveStream = null;
    StreamReader sr = null;
    System.Net.WebRequest reqPOST = System.Net.WebRequest.Create(upload_url);
    reqPOST.Method = "POST"; // Устанавливаем метод передачи данных в POST
    reqPOST.ContentType = "multipart/form-data"; // указываем тип контента
    byte[] sentData = Encoding.GetEncoding("utf-8").GetBytes("&file1=" + album_pic);
    reqPOST.ContentLength = sentData.Length;
    System.IO.Stream sendStream = reqPOST.GetRequestStream();
    sendStream.Write(sentData, 0, sentData.Length);
    sendStream.Close();
    // считываем результат работы
    result = reqPOST.GetResponse();
    ReceiveStream = result.GetResponseStream();
    Encoding encode = Encoding.GetEncoding("utf-8");
    sr = new StreamReader(ReceiveStream, encode);
    Char[] read = new Char[256];
    int count = sr.Read(read, 0, 256);
    string strOut = "";
    while (count > 0)
    {
        String str = new String(read, 0, count);
        strOut += str;
        count = sr.Read(read, 0, 256);
    }
    return strOut;
}
catch (Exception ex) { return ex.Message; }
}
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.05.2011, 10:17
Ответы с готовыми решениями:

Загрузка фото на стену через vk api
Приветствую.Есть код: <? function getSslPage($url) { $ch = curl_init(); ...

OAuth: авторизация вконтакте и получение токена для использования API
Здравствуйте. Решил реализовать приложение для парсинга некой информации пользователей вк. Первый...

API Vkontakte загрузка изображений на стену
похоже я злостно туплю ( проблема в сабже, на сайте вконтакта есть описание процесса 1. С...

API Vkontakte загрузка графики на стену
похоже я злостно туплю ( проблема в сабже, на сайте вконтакта есть описание процесса 1. С...

3
2 / 2 / 0
Регистрация: 03.08.2010
Сообщений: 16
10.06.2011, 15:34  [ТС] 2
Все, нашел решение, надо последовательно передавать в поток данные, тогда с заголовками нормально будет, вот, может кому пригодится:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//string upload_url = "полученная строка в GetUploadUrl"; 
//byte[] pic = картинка (из файла или же перевод из Image
HttpWebRequest Request = (HttpWebRequest)WebRequest.Create(upload_url);
Stream _stream;
string _boundary = String.Format("--{0}", GetMD5());
string _templateFile = "--{0}\r\nContent-Disposition: form-data; name=\"{1}\"; filename=\"{2}\"\r\nContent-Type: {3}\r\n\r\n";
string _templateEnd = "--{0}--\r\n\r\n";
Request.Method = "POST";
Request.ContentType = String.Format("multipart/form-data; boundary={0}", _boundary);
_stream = Request.GetRequestStream();
string FilePath = "test.jpg";
string FileType = "application/octet-stream";
string Name = "file1";
byte[] contentFile = Encoding.UTF8.GetBytes(String.Format(_templateFile, _boundary, Name, FilePath, FileType));
_stream.Write(contentFile, 0, contentFile.Length);
_stream.Write(pic, 0, pic.Length);
byte[] _lineFeed = Encoding.UTF8.GetBytes("\r\n");
_stream.Write(_lineFeed, 0, _lineFeed.Length);
byte[] contentEnd = Encoding.UTF8.GetBytes(String.Format(_templateEnd, _boundary));
_stream.Write(contentEnd, 0, contentEnd.Length);
HttpWebResponse webResponse = (HttpWebResponse)Request.GetResponse();
StreamReader read = new StreamReader(webResponse.GetResponseStream());
return read.ReadToEnd();
П.С. спасибо http://tdlite.ru/csharp/multipartformdata/
2
11 / 11 / 2
Регистрация: 15.01.2012
Сообщений: 104
10.05.2014, 16:55 3
Scarm, а есть такой же метод для аудио? не получается, возращает ерор
0
0 / 0 / 0
Регистрация: 14.09.2014
Сообщений: 2
17.10.2014, 16:05 4
Спасибо за тему! Вот только картинка не загружается. При дебаге на шаге _stream = Request.GetRequestStream(); возникает исключение:
+ Length '((System.Net.ConnectStream)_stream).Length' threw an exception of type 'System.NotSupportedException' long {System.NotSupportedException}
+ base {"Этот поток не поддерживает операций поиска."} System.SystemException {System.NotSupportedException}
Кто сталкивался? Как это побороть можно?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.10.2014, 16:05

Помощь в написании контрольных, курсовых и дипломных работ здесь.

«ВКонтакте» через месяц переедет с российского домена vkontakte.ru на домен верхнего уровня vk.com
Социальная сеть «ВКонтакте» через месяц полностью переедет с российского домена vkontakte.ru на...

Авторизация на сайте через соцсети (API, OAuth)
Помогите.

Загрузка фотографии на сервер Вконтакте API
Хочу отправить фотографию сообщением но тут sil:=idHTTP.Id_HTTPMethodPOST(sil,post); выдает...

Загрузка фото VK API
Пытаюсь загрузить фото в альбом с помощью VK API. Загрузка фотографий на сервер ВКонтакте от имени...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.