2012-08-09 4 views

Antwort

7

Um ein Audio mit Soundcloud der REST-API Sie kümmern sich um HTTP-POST-Fragen (RFC 1867) nehmen müssen zu laden. Im Allgemeinen unterstützt ASP.NET nicht von mehreren Dateien/Werten Senden POST, so schlage ich vor, Sie Krystalware Bibliothek verwenden: http://aspnetupload.com/Upload-File-POST-HttpWebRequest-WebClient-RFC-1867.aspx

Nach dass Sie den richtigen Formularfelder an die https://api.soundcloud.com/tracks url senden müssen:

  • Auth-Token (oauth_token)
  • Track title (Titel [title])
  • Die Datei (Track [asset_data])

Beispielcode:

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(); 
} 

Der Beispielcode können Sie eine Audio-Datei vom Server (man beachte die Server.MapPath Methode Pfad zur Datei zu bilden) laden und eine Antwort im JSON-Format (reader.ReadToEnd)

+0

Schön! Es klappt! –

+0

wo kann ich dieses oauth_token bekommen? Ich habe eine Anwendung auf Sound Cloud hinzugefügt, aber nicht heiß, um das oauth_token zu generieren. –

4
zu erhalten Hier

ist ein Code-snippet Spur über die Soundcloud API =>

 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

Hier eine weitere Möglichkeit zum hochladen nicht bekommen auslaufenden Token und Upload Track Soundcloud mit 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

Wo ist ISoundPlatformService definiert? – Howiecamp

+0

ISoundPlatformService-Schnittstelle enthält nur die Definition der Methoden. Es ist eine benutzerdefinierte Schnittstelle, ich meine, diese Schnittstelle befindet sich nicht in einer Sound Cloud-DLL. Ich definiere diese Schnittstelle, um IoC zu verwenden. –

+0

Oh ok. Vielleicht möchten Sie das aus dem Code entfernen, um es einfacher zu machen und niemanden zu fragen. – Howiecamp