-1

API ドキュメントを使用して Rapidshare にアップロードしようとしています。すでに多くの記事を見ましたが、それでも「完了」することはできませんでした。現在、次の応答エラーが発生し続けています。

エラー: サブルーチンが無効です。(b6ba5d82)

次のドキュメントを使用しました。

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

また、stackoverflow で見つけた例も使用しました。

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
4

1 に答える 1

0

URL自体にデータを入れるべきではないため、機能しません。Rapidshare アップロードのベース URL は次のとおりです。

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

他のすべてのものは multipart-form 自体に入れる必要があります。

詳細情報を取得するには、シェルで試してください。

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すると、ファイルのアップロード中に発生するすべてのことを確認できます (ヘッダーの送受信、投稿されたデータなど)。これは、デバッグ目的には十分便利です

于 2013-03-16T07:00:00.367 に答える