-1

I trying to upload to Rapidshare using the API documentation. I already seen a lot of article but still I was not able to get it "Done". Currently I keep on getting the following response error:

ERROR: Subroutine invalid. (b6ba5d82)

I used the following documentation:

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

and also used an example I found on stackoverflow:

Upload files with HTTPWebrequest (multipart/form-data)

I am using the following code:

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
Community
  • 1
  • 1
shouce
  • 1
  • 2

1 Answers1

0

It doesn't work because you should'nt put data in the URL itself. The base URL for rapidshare upload is only :

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

All the other stuff has to be put in the multipart-form itself.

To get more infos, try in a shell:

nextserver=$( \
    curl http://api.rapidshare.com/cgi-bin/rsapi.cgi?sub=nextuploadserver)

And then:

curl -F sub=upload \
     -F filecontent="@foo;filename=foo" \
     -F login=myname -F password=mypassword \
     https://rs$nextserver.rapidshare.com/cgi-bin/rsapi.cgi

With the --verbose or --trace switches you can see all that happens during the upload of the file (headers sent and received, data posted, etc.). This is convenient enough for debugging purpose

michaelmeyer
  • 7,985
  • 7
  • 30
  • 36