我尝试使用API文档上传到Rapidshare。我已经看过很多文章,但仍然无法让它“完成”。目前我一直收到以下响应错误:
错误:子程序无效。 (b6ba5d82)
我使用了以下文档:
http://images.rapidshare.com/apidoc.txt
并且还使用了我在stackoverflow上找到的一个例子:
Upload files with HTTPWebrequest (multipart/form-data)
我使用以下代码:
Sub Main
Dim freeurl As String = "http://api.rapidshare.com/cgi-bin/rsapi.cgi?sub=nextuploadserver"
Dim req As WebRequest = WebRequest.Create(freeurl)
Dim response = req.GetResponse().GetResponseStream()
Dim reader As New StreamReader(response)
Dim nextfreeserver = reader.ReadToEnd()
req = Nothing
response = Nothing
reader= Nothing
Dim login As String = "********"
Dim password As String = "********"
Dim filename As string = "test12345.txt"
Dim filepath = "C:\Users\Public\Documents\" & filename
Dim uploadurl As String = "https://rs" & nextfreeserver & ".rapidshare.com/cgi-bin/rsapi.cgi?sub=upload"
uploadurl = uploadurl & "&login=" & login & "&password=" & password & "&filename" & filename & "&filecontent=" & filepath
Dim nvc As NameValueCollection = new NameValueCollection()
nvc.Add("sub", "upload")
nvc.Add("login", login)
nvc.Add("password", password)
Dim resp As String = ""
resp = HttpUploadFile("https://rs" & nextfreeserver & ".rapidshare.com/cgi-bin/rsapi.cgi", filepath, "filecontent", "application/octet-stream", nvc)
End Sub
Public Shared Function HttpUploadFile(url As String, file As String, paramName As String, contentType As String, nvc As NameValueCollection) As string
Dim boundary As String = "---------------------------" & DateTime.Now.Ticks.ToString("x")
Dim boundarybytes As Byte() = System.Text.Encoding.ASCII.GetBytes(vbCr & vbLf & "--" & boundary & vbCr & vbLf)
Dim wr As HttpWebRequest = DirectCast(WebRequest.Create(url), HttpWebRequest)
wr.ContentType = "multipart/form-data; boundary=" & boundary
wr.Method = "POST"
wr.KeepAlive = True
wr.Credentials = System.Net.CredentialCache.DefaultCredentials
Dim rs As Stream = wr.GetRequestStream()
Dim formdataTemplate As String = "Content-Disposition: form-data; name=""{0}""" & vbCr & vbLf & vbCr & vbLf & "{1}"
For Each key As String In nvc.Keys
rs.Write(boundarybytes, 0, boundarybytes.Length)
Dim formitem As String = String.Format(formdataTemplate, key, nvc(key))
Dim formitembytes As Byte() = System.Text.Encoding.UTF8.GetBytes(formitem)
rs.Write(formitembytes, 0, formitembytes.Length)
Next
rs.Write(boundarybytes, 0, boundarybytes.Length)
Dim headerTemplate As String = "Content-Disposition: form-data; name=""{0}""; filename=""{1}""" & vbCr & vbLf & "Content-Type: {2}" & vbCr & vbLf & vbCr & vbLf
Dim header As String = String.Format(headerTemplate, paramName, file, contentType)
Dim headerbytes As Byte() = System.Text.Encoding.UTF8.GetBytes(header)
rs.Write(headerbytes, 0, headerbytes.Length)
Dim fileStream As New FileStream(file, FileMode.Open, FileAccess.Read)
Dim buffer As Byte() = New Byte(4095) {}
Dim bytesRead As Integer = 0
While (InlineAssignHelper(bytesRead, fileStream.Read(buffer, 0, buffer.Length))) <> 0
rs.Write(buffer, 0, bytesRead)
End While
fileStream.Close()
Dim trailer As Byte() = System.Text.Encoding.ASCII.GetBytes(vbCr & vbLf & "--" & boundary & "--" & vbCr & vbLf)
rs.Write(trailer, 0, trailer.Length)
rs.Close()
Dim wresp As WebResponse = Nothing
Try
wresp = wr.GetResponse()
Dim stream2 As Stream = wresp.GetResponseStream()
Dim reader2 As New StreamReader(stream2)
return reader2.ReadToEnd()
If wresp IsNot Nothing Then
wresp.Close()
wresp = Nothing
End If
Finally
wr = Nothing
End Try
End Function
Private Shared Function InlineAssignHelper(Of T)(ByRef target As T, value As T) As T
target = value
Return value
End Function
答案 0 :(得分:0)
它不起作用,因为您不应该将数据放入URL本身。 rapidshare上传的基本网址仅为:
https://rs + nextfreeserver + .rapidshare.com/cgi-bin/rsapi.cgi
所有其他东西都必须放在多部分表格中。
要获得更多信息,请尝试使用shell:
nextserver=$( \
curl http://api.rapidshare.com/cgi-bin/rsapi.cgi?sub=nextuploadserver)
然后:
curl -F sub=upload \
-F filecontent="@foo;filename=foo" \
-F login=myname -F password=mypassword \
https://rs$nextserver.rapidshare.com/cgi-bin/rsapi.cgi
使用--verbose
或--trace
开关,您可以看到上传文件期间发生的所有事件(发送和接收的标头,发布的数据等)。这对于调试来说非常方便