2013-03-13 83 views
-1

我試圖使用API​​文檔上傳到Rapidshare。我已經看過很多文章,但仍然無法完成「完成」。目前,我不斷獲取以下響應錯誤:Rapidshare API上傳文件

ERROR: Subroutine invalid. (b6ba5d82)

我用了以下文件:

http://images.rapidshare.com/apidoc.txt

,並用我的計算器找到了一個例子:

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

它不工作,因爲你不應該把數據放在URL本身。 rapidshare上傳的基本URL只有:

https://rs + nextfreeserver + .rapidshare.com/cgi-bin/rsapi.cgi 

所有其他的東西都必須放在multipart-form本身。

爲了獲得更多的相關信息,儘量在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開關,你可以看到所有文件的上傳過程中發生(發送和接收的標題,發佈的數據等)。這對於調試目的來說足夠方便