#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(); }
Комментариев нет:
Отправить комментарий