2012-08-09 41 views

Trả lời

7

Để tải lên một âm thanh sử dụng API REST SoundCloud của bạn cần phải chăm sóc HTTP POST vấn đề liên quan (RFC 1867). Nói chung, ASP.NET không hỗ trợ việc gửi nhiều file/giá trị sử dụng POST, vì vậy tôi khuyên bạn nên sử dụng Krystalware thư viện: http://aspnetupload.com/Upload-File-POST-HttpWebRequest-WebClient-RFC-1867.aspx

Sau đó bạn cần phải gửi các trường mẫu thích hợp để các https://api.soundcloud.com/tracks url:

  • Auth token (oauth_token)
  • Theo dõi Tiêu đề (theo dõi [title])
  • Các tập tin (theo dõi [asset_data])

mẫu mã:

using Krystalware.UploadHelper; 
... 

System.Net.ServicePointManager.Expect100Continue = false; 
var request = WebRequest.Create("https://api.soundcloud.com/tracks") as HttpWebRequest; 
//some default headers 
request.Accept = "*/*"; 
request.Headers.Add("Accept-Charset", "ISO-8859-1,utf-8;q=0.7,*;q=0.3"); 
request.Headers.Add("Accept-Encoding", "gzip,deflate,sdch"); 
request.Headers.Add("Accept-Language", "en-US,en;q=0.8,ru;q=0.6"); 

//file array 
var files = new UploadFile[] { 
    new UploadFile(Server.MapPath("Downloads//0.mp3"), "track[asset_data]", "application/octet-stream") 
}; 
//other form data 
var form = new NameValueCollection(); 
form.Add("track[title]", "Some title"); 
form.Add("track[sharing]", "private"); 
form.Add("oauth_token", this.Token); 
form.Add("format", "json"); 

form.Add("Filename", "0.mp3"); 
form.Add("Upload", "Submit Query"); 
try 
{ 
    using (var response = HttpUploadHelper.Upload(request, files, form)) 
    { 
     using (var reader = new StreamReader(response.GetResponseStream())) 
     { 
      lblInfo.Text = reader.ReadToEnd(); 
     } 
    } 
} 
catch (Exception ex) 
{ 
    lblInfo.Text = ex.ToString(); 
} 

Đoạn mã ví dụ cho phép bạn tải lên một tập tin âm thanh từ máy chủ (chú ý phương pháp Server.MapPath để tạo thành đường dẫn đến tập tin) và để có được một phản ứng trong định dạng json (reader.ReadToEnd)

+0

Đẹp! Nó hoạt động! –

+0

nơi tôi có thể nhận được oauth_token này? tôi đã thêm một ứng dụng trên đám mây âm thanh nhưng không biết nóng để tạo ra oauth_token. –

4

Dưới đây là một đoạn mã để tải bài hát qua API SoundCloud =>

 using (HttpClient httpClient = new HttpClient()) { 
      httpClient.DefaultRequestHeaders.ConnectionClose = true; 
      httpClient.DefaultRequestHeaders.UserAgent.Add(new ProductInfoHeaderValue("MySoundCloudClient", "1.0")); 
      httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 
      httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("OAuth", "MY_AUTH_TOKEN"); 
      ByteArrayContent titleContent = new ByteArrayContent(Encoding.UTF8.GetBytes("my title")); 
      ByteArrayContent sharingContent = new ByteArrayContent(Encoding.UTF8.GetBytes("private")); 
      ByteArrayContent byteArrayContent = new ByteArrayContent(File.ReadAllBytes("MYFILENAME")); 
      byteArrayContent.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream"); 
      MultipartFormDataContent content = new MultipartFormDataContent(); 
      content.Add(titleContent, "track[title]"); 
      content.Add(sharingContent, "track[sharing]"); 
      content.Add(byteArrayContent, "track[asset_data]", "MYFILENAME"); 
      HttpResponseMessage message = await httpClient.PostAsync(new Uri("https://api.soundcloud.com/tracks"), content); 

      if (message.IsSuccessStatusCode) { 
       ... 
      } 
2

đây một cách khác để có được không hết hạn thẻ và tải lên đà SoundCloud sử dụng C#:

public class SoundCloudService : ISoundPlatformService 
{ 
    public SoundCloudService() 
    { 
     Errors=new List<string>(); 
    } 

    private const string baseAddress = "https://api.soundcloud.com/"; 

    public IList<string> Errors { get; set; } 

    public async Task<string> GetNonExpiringTokenAsync() 
    { 
     using (var client = new HttpClient()) 
     { 
      client.BaseAddress = new Uri(baseAddress); 
      var content = new FormUrlEncodedContent(new[] 
      { 
       new KeyValuePair<string, string>("client_id","xxxxxx"), 
       new KeyValuePair<string, string>("client_secret","xxxxxx"), 
       new KeyValuePair<string, string>("grant_type","password"), 
       new KeyValuePair<string, string>("username","[email protected]"), 
       new KeyValuePair<string, string>("password","xxxxx"), 
       new KeyValuePair<string, string>("scope","non-expiring") 
      }); 

      var response = await client.PostAsync("oauth2/token", content); 

      if (response.StatusCode == HttpStatusCode.OK) 
      { 
       dynamic data = JsonConvert.DeserializeObject(await response.Content.ReadAsStringAsync()); 
       return data.access_token; 
      } 

      Errors.Add(string.Format("{0} {1}", response.StatusCode, response.ReasonPhrase)); 

      return null; 
     } 
    }   

    public async Task UploadTrackAsync(string filePath) 
    { 
     using (var client = new HttpClient()) 
     { 
      client.BaseAddress=new Uri(baseAddress); 

      var form = new MultipartFormDataContent(Guid.NewGuid().ToString()); 

      var contentTitle = new StringContent("Test"); 
      contentTitle.Headers.ContentType = null; 
      form.Add(contentTitle, "track[title]"); 

      var contentSharing = new StringContent("private"); 
      contentSharing.Headers.ContentType = null; 
      form.Add(contentSharing, "track[sharing]"); 

      var contentToken = new StringContent("xxxxx"); 
      contentToken.Headers.ContentType = null; 
      form.Add(contentToken, "[oauth_token]"); 

      var contentFormat = new StringContent("json"); 
      contentFormat.Headers.ContentType = null; 
      form.Add(contentFormat, "[format]"); 

      var contentFilename = new StringContent("test.mp3"); 
      contentFilename.Headers.ContentType = null; 
      form.Add(contentFilename, "[Filename]"); 

      var contentUpload = new StringContent("Submit Query"); 
      contentUpload.Headers.ContentType = null;         
      form.Add(contentUpload, "[Upload]"); 

      var contentTags = new StringContent("Test"); 
      contentTags.Headers.ContentType = null; 
      form.Add(contentTags, "track[tag_list]"); 

      var bytes = File.ReadAllBytes(filePath);     
      var contentFile = new ByteArrayContent(bytes, 0, bytes.Count());     
      contentFile.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream"); 
      form.Add(contentFile, "track[asset_data]", "test.mp3"); 

      var response = await client.PostAsync("tracks", form);     
     } 
    } 
} 
+0

ISoundPlatformService được định nghĩa ở đâu? – Howiecamp

+0

Giao diện ISoundPlatformService chỉ chứa định nghĩa của các phương thức. Đó là một giao diện tùy chỉnh, ý tôi là, giao diện đó không nằm trong một tệp Sound Cloud dll. Tôi định nghĩa giao diện đó để sử dụng IoC. –

+0

Oh ok. Bạn có thể muốn loại bỏ nó khỏi mã chỉ để làm cho nó đơn giản hơn và không để ai tự hỏi. – Howiecamp

Các vấn đề liên quan