.NET 4.x Загрузка фото Вконтакте C# с авторизацией через oauth+api.vkontakte
Формулировка задачи:
Всем привет, прошу помощи, т.к. мозги уже кипят, и какие маны курить уже не знаю.
Есть внешнее desktop приложение на C# с авторизацией через oauth, нужно залить фото в созданный альбом.
Действую по рекомендованной здесь http://vkontakte.ru/developers.php?o...F2%E0%EA%F2%E5 схеме.
1. Выполняю photos.getUploadServer, получаю upload_url
2. формирую POST запрос на полученный адрес, и здесь спотыкаюсь, всегда в ответе возвращается пустое поле "photos_list": "", что делает невозможным переход к третьему шагу (photos.save)
На втором шаге считываю изображение test.jpg в массив byte[] album_pic и ставлю его в POST
Что делаю не так? Вот код:
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; }
}Решение задачи: «.NET 4.x Загрузка фото Вконтакте C# с авторизацией через oauth+api.vkontakte»
textual
Листинг программы
//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();