2012-08-09 16 views

Respuesta

7

Para cargar un archivo de audio usando la API REST de Soundcloud que necesita para cuidar de HTTP POST temas relacionados (RFC 1867). En general, ASP.NET no admite el envío de múltiples archivos/valores usando POST, lo que sugiere que utilice la biblioteca Krystalware: http://aspnetupload.com/Upload-File-POST-HttpWebRequest-WebClient-RFC-1867.aspx

Después de que usted necesita para enviar campos de formulario adecuados a la https://api.soundcloud.com/tracks url:

  • de autenticación token (oauth_token)
  • título de la pista (pista [título])
  • El archivo (pista [asset_data])

código de la muestra:

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

El código de ejemplo le permite cargar un archivo de audio desde el servidor (observa el método Server.MapPath para formar ruta de acceso al archivo) y obtener una respuesta en formato JSON (reader.ReadToEnd)

+0

¡Agradable! ¡Funciona! –

+0

donde puedo obtener esta oauth_token? Agregué una aplicación en la nube de sonido, pero no sabía demasiado para generar oauth_token. –

4

Aquí es un fragmento de código para cargar la pista a través de la 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

Aquí otra manera de conseguir no expira token y subir a la pista SoundCloud usando 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

¿Dónde se define ISoundPlatformService? – Howiecamp

+0

La interfaz ISoundPlatformService contiene solo la definición de los métodos. Es una interfaz personalizada, es decir, esa interfaz no está dentro de un dll de Sound Cloud. Defino esa interfaz para usar IoC. –

+0

Oh, está bien. Es posible que desee eliminar eso del código solo para hacerlo más simple y no dejar a nadie preguntándose. – Howiecamp

Cuestiones relacionadas