Rapidshare API上传文件

时间:2013-03-13 14:41:01

标签: .net vb.net razor upload rapidshare

我尝试使用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

1 个答案:

答案 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开关,您可以看到上传文件期间发生的所有事件(发送和接收的标头,发布的数据等)。这对于调试来说非常方便