Страницы

Поиск по вопросам

пятница, 3 января 2020 г.

Как сделать POST запрос загрузки аудио файла вконтакте (vk api)? C#

#c_sharp #vkontakte_api #post


Сначала делаю запрос для получения адреса сервера для загрузки

https://api.vk.com/method/docs.getUploadServer?access_token=ACCESS_TOKEN&type=audio_message&v=5.63


В ответ получаю

{
  "response":
             {
               "upload_url":"https://..."
             }
}


Из этой строки извлекаю только адрес ссылки.
Теперь возникла проблема загрузки аудио файла на сервер. Как бы я не пробовал отсылать,
возвращалась пустая строка. В документации ВК написано:

Допустимые форматы: MP3. 
Ограничения: файл объемом не более 200 МБ. 
Поле POST-запроса: file.

Передача файла:
Передайте файл на адрес upload_url, полученный в предыдущем пункте, 
сформировав POST-запрос с полем file. Это поле должно содержать mp3-файл в 
формате multipart/form-data. 


Возможно, я неправильно делаю запрос. Буду благодарен за пример кода на C# POST запроса
загрузки аудио файла. 
Мой вариант кода:

string filePath = @"D:\Soft\Visual Studio\Projects\VK audio messages\VK audio messages\VK
audio messages\l1.mp3";

byte[] audio = convert(filePath);
HttpClient httpClient = new HttpClient();
MultipartFormDataContent form = new MultipartFormDataContent();

form.Add(new ByteArrayContent(audio, 0, audio.Length), "file", "l1.mp3");
HttpResponseMessage response = await httpClient.PostAsync(uploadUrl, form);
response.EnsureSuccessStatusCode();
httpClient.Dispose();
string sd = response.Content.ReadAsStringAsync().Result;
MessageBox.Show(sd);
****


byte[] convert(string fullFilePath)
   {
       FileStream fs = File.OpenRead(fullFilePath);
       byte[] bytes = new byte[fs.Length];
       fs.Read(bytes, 0, Convert.ToInt32(fs.Length));
       fs.Close();
       return bytes;
   }

    


Ответы

Ответ 1



Каким образом вы пытаетесь сделать запрос? В документации VK написано: Передача содержимого файлов на полученный адрес в формате multipart/form-data. Соответственно, загружать ваш файл нужно подобающим образом. В С# я не силён, вот первый попавшийся вариант из гугла, взято отсюда: HttpClient httpClient = new HttpClient(); MultipartFormDataContent form = new MultipartFormDataContent(); form.Add(new ByteArrayContent(imagebytearraystring, 0, imagebytearraystring.Length), "profile_pic", "hello1.jpg"); HttpResponseMessage response = await httpClient.PostAsync("PostUrl", form); response.EnsureSuccessStatusCode(); httpClient.Dispose(); string sd = response.Content.ReadAsStringAsync().Result; Именем поля должно быть file, а url, куда загружаем - полученный ранее upload_url. Пробовали ли вы подобный способ? Поищите примеры загрузки файлов в multipart/form-data формате на C#.

Ответ 2



У меня получилось так (не тестил с аудио, сделал с doc) using (var formData = new MultipartFormDataContent()) { var uploadServerUrl = string.Format("https://api.vk.com/method/docs.getMessagesUploadServer?type=doc&peer_id={0}&access_token={1}", user_id, access_tokken).GetStringFromUrl(); string url = JsonObject.Parse(uploadServerUrl).Get("response").Get("upload_url"); var httpClient = new HttpClient(); MultipartFormDataContent form = new MultipartFormDataContent(); form.Add(new ByteArrayContent(System.IO.File.ReadAllBytes(PathToFile)), "file", "name.txt"); HttpResponseMessage response = await httpClient.PostAsync(url, form); response.EnsureSuccessStatusCode(); httpClient.Dispose(); string fileFromVKServer = response.Content.ReadAsStringAsync().Result; var saveFile = string.Format("https://api.vk.com/method/docs.save?file={0}&access_token={1}", JsonObject.Parse(fileFromVKServer).Get("file") , access_token).GetStringFromUrl(); }

Комментариев нет:

Отправить комментарий