可能涉及的人,
我有一个程序记录声音(* .wav(s)转换为* .wma(s)和* .m4a(s))我正试图上传到SoundCloud(以前该程序已烧录CD的WMP播放列表,然后我添加了一个制作* .zip播放列表并将其附加到电子邮件的部分),现在我的用户想要将WMP播放列表上传到他们的SoundCloud帐户。
我已经添加了一个例程来将* .zip文件上传到Dropbox,并且工作正常。由于Dropbox的oauth2与SoundCloud的oauth2非常相似,我能够将我的应用程序添加到SoundCloud应用程序列表中,然后将一个浏览器控件添加到我的程序中,以便用户“允许”我的应用程序“链接”到他们的SoundCloud帐户(非常类似于Dropbox处理它的方式)。 所以我已经达到了上传的目的,但处理方式却截然不同,而且我很难尝试让它工作(在Visual Basic中找到合适的HTTP处理程序来做我需要做的事情)。 / p>
在我的Dropbox部分中,我只需创建一条POST消息,其中包含文件的标题和URL中的oauth2 access_token,然后我只是读取* .zip文件(或我要去的任何文件)上传)并将其内容写入GetRequestStream。我唯一的绊脚石是“内容类型”,它必须是“应用程序/ zip”或文件的任何扩展名,瞧,它已上传。
我一直在阅读有关多部分表单的内容,我有点困惑(同样,Visual Basic中的HTTP结构的机制可能有点不同......呃!......然后在其他语言中......但是我我会试着解释一下。
我遇到了一个使用另一个构造函数的示例。而不是我用来构建我的“请求”和“响应”通信的 HttpRequest ,这个有一个WebClient。 WebClient 可以添加标题(Accept-Charset,Accept-Encoding,Accept-Language,Content-Type,Content-Disposition)以及QueryString(这是我放置oath_token,track [asset]的地方-data],跟踪[标题]等)。最后,WebClient构造函数有一个WebClient.UploadFile命令(它接受了URL和物理文件名...我相信它会处理文件内容写入请求)。
所以...在经历了大约400,401(必须处理即将到期的令牌东西),422,一个503和一堆500(这是我目前所在的地方)之后,我仍然无法上传简单* .wma文件: Track001.wma 。
这是我的代码(strFileName已经使用物理名称构建 声音文件\ | dir | \ Track001.wma和strAccessToken已经存在 从SoundCloud获得):
strURL = "https://api.soundcloud.com/tracks.json?oauth_token=" & strAccessToken
Dim myWebClient As New WebClient
myWebClient.Headers.Add("Accept-Charset", "ISO-8859-1,utf-8;q=0.7,*;q=0.3")
myWebClient.Headers.Add("Accept-Encoding", "gzip,deflate,sdch")
myWebClient.Headers.Add("Accept-Language", "en-US,en;q=0.8,ru;q=0.6")
myWebClient.Headers.Add("Content-Disposition: form-data; name=track[title]")
我也试过这一行:
myWebClient.Headers.Add("Content-Disposition: form-data; name=" & HttpUtility.UrlEncode(strFileName))
这增加了SoundCloud参数
Dim myQueryStringCollection As New NameValueCollection()
myQueryStringCollection.Add("oauth_token", strAccessToken)
myQueryStringCollection.Add("track[asset_data]", strFileName)
myQueryStringCollection.Add("track[title]", "Test Track Upload")
myQueryStringCollection.Add("track[sharing]", "public")
myQueryStringCollection.Add("track[downloadable]", "true")
myQueryStringCollection.Add("track[post_to]", "")
这将params附加到Request
中
myWebClient.QueryString = myQueryStringCollection
这是我尝试发送的地方
Dim responseArray As Byte() = myWebClient.UploadFile(strURL, strFileName)
但我在这里收到错误: {“errors”:[{“error_message”:“422 - 不可处理的实体“}]} 如果我将Content-type设置为multi-form,我 get:无法将Content-Type标头设置为多部分类型 此请求
我只是试图再次获得500,但我现在得到的只是422(所以也许它固定在另一端?)。