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