1. #1
    Avatar von milchbubix
    Registriert seit
    06.12.2011
    Beiträge
    757
    Thanked 413 Times in 271 Posts

    Standard Share-Online.biz Datei-Upload per API

    Ich versuche mit meinem Programm eine Datei auf share-online.biz hochzuladen. Die Seite bietet auch eine API die sich hier finden lässt.
    Allerding sscheitere ich immer beim hochladen mit der Fehlermeldung:
    Der Remoteserver hat einen Fehler zurückgegeben: (415) Unsupported Media Type.
    Das sind die Variablen:
    Code:
    Upload the data:
    
    Getting the session is really easy, uploading without any chunk-usage, too. So we start with the single file upload ;-):
    Single Upload:
            Request to:        http://server/upv3.php
    
            Required Vars:
            [username]         account username
            [password]         account password
            [upload_session]   upload session name from step 1
            [chunk_no]         set to "1"
            [chunk_number]     set to "1"
            [filesize]         filesize of current file in bytes
            [fn]               filedata (in HTTP forms known as type="file")
            [finalize]         set to "1"
    
            Response:          DOWNLOAD-URL;FILESIZE;MD5
    
            Example:           http://www.share-online.biz/dl/HJD74ZDM1;
                               6547231;316508123e89909723fe95945caf00a5
                               (linebreak only in example!)
    Und mein Programm Code ist folgend:

     Using client As New WebClient

    'Variablen in NameValueCollection speichern
    Dim uploadVar As New Specialized.NameValueCollection

    uploadVar.Add("username", soUserNameBox.Text)
    uploadVar.Add("password", soPasswordBox.Text)
    uploadVar.Add("upload_session", sessionName)
    uploadVar.Add("chunk_no", 1)
    uploadVar.Add("chunk_number", 1)
    uploadVar.Add("filesize", fileSize)
    uploadVar.Add("fn", fileName)
    uploadVar.Add("finalize", 1)


    Try

    'API Upload
    Dim responsebytes = client.UploadValues("http://" & uploadServer, "POST", uploadVar)
    Dim responsebody = (New UTF8Encoding).GetString(responsebytes)
    MessageBox.Show(responsebody)

    Catch e As WebException

    MsgBox(e.Message)

    End Try
    End Using


    Wäre nett wenn jemand ne Idee hätte
    Geändert von milchbubix (04.11.2015 um 22:06 Uhr)


    Egal was du hast, es ist nie das was du willst.

    Denkbar finde ich auch, daß es außerirdische Lebensformen geben kann, die es darauf abgesehen haben, die Erde zu erobern, um sich hier anzusiedeln. Dabei wären die Menschen ja eher störend. Die Außerirdischen inszenieren dann solche Katastrophen wie 9/11 und legen falsche Spuren, um die Menschheit gegeneinander aufzuhetzen, damit sie sich selber ausrottet.


  2. #2
    Avatar von DMW007
    Registriert seit
    15.11.2011
    Beiträge
    6.210
    Thanked 9.132 Times in 3.006 Posts
    Blog Entries
    5

    Standard AW: Datei Upload per API

    Wie bei Dateiuploads üblich wird auch bei Share-Online multipart/form-data als Content-Typ verwendet. Siehe das Beispiel am Ende der Doku. Da du keinen angibst wird der Standard verwendet, nämlich application/x-www-form-urlencoded. Der HTTP-Body unterscheidet sich bei beiden Typen erheblich. Während in letzterem Fall wie der Name schon vermuten lässt die Daten URL-Kodiert versendet werden (feldA=x&feldB=y), definiert multipart/form-data die jeweiligen Felder genauer und trennt diese mit einem Boundary. Dadurch kann das Upload-Feld mit seinem jeweiligen Mime-Type (und dadurch auch als binär) gekennzeichnet werden, wodurch das ineffiziente escapen der herkömmlichen Variante entfällt. Dies könnte beispielsweise so aussehen:
    Code:
    ------Boundary
    Content-Disposition: form-data; name="fn"; filename="EinBild.png"
    Content-Type: image/png
    Zu beachten ist, dass der Boundary nicht im Inhalt der Datei vorkommen darf. Es werden daher gerne Bindestriche in Kombination mit einem Unix-Timestamp und/oder einem zufällig generierter String genutzt, was sich je nach Browser unterscheidet. Chrome generiert aktuell z.B. einen Boundary im Format
    Code:
    ------WebKitFormBoundaryuRmCh9N0bGQvmZBE
    Ausführlicher wird dies in den Spezifikationen beschrieben:
    Forms in HTML documents
    RFC 2388t

    Nativ ist dies im Kern von .NET tatsächlich nicht implementiert, dies wurde in die HttpClient-Library ausgelagert. Man kann sie im Paket Microsoft.Net.Http mithilfe von NuGet einfach nachinstallieren. Beispielhafte Verwendung siehe hier c# - How to upload file to server with HTTP POST multipart/form-data - Stack Overflow in der ersten Antwort. Allerdings lässt sich der Body auch recht einfach selbst erzeugen, wenn man den Aufbau verstanden hat.


  3. The Following User Says Thank You to DMW007 For This Useful Post:

    milchbubix (04.11.2015)

  4. #3
    Avatar von milchbubix
    Registriert seit
    06.12.2011
    Beiträge
    757
    Thanked 413 Times in 271 Posts

    Standard AW: Share-Online.biz Datei-Upload per API

    Vielen Dank für die Ausführliche Antwort. Die erste Antwort bei dem StackOverflow benutzt allerdings MultipartFormDataContent welches anscheinend erst ab .NET Framework 4.5 verfügbar ist. Mein Projekt soll allerdings mit .NET 2.0 auskommen. Gibt es andere Möglichkeiten das zu regeln?


    Egal was du hast, es ist nie das was du willst.

    Denkbar finde ich auch, daß es außerirdische Lebensformen geben kann, die es darauf abgesehen haben, die Erde zu erobern, um sich hier anzusiedeln. Dabei wären die Menschen ja eher störend. Die Außerirdischen inszenieren dann solche Katastrophen wie 9/11 und legen falsche Spuren, um die Menschheit gegeneinander aufzuhetzen, damit sie sich selber ausrottet.


  5. #4
    Avatar von DMW007
    Registriert seit
    15.11.2011
    Beiträge
    6.210
    Thanked 9.132 Times in 3.006 Posts
    Blog Entries
    5

    Standard AW: Share-Online.biz Datei-Upload per API

    Dann mal recherchieren ob es alternative Librarys bzw. am besten gleich NuGet-Pakete für .NET 2.0 gibt. Scheint aber schlecht auszusehen, habe auf die schnelle nichts gefunden. Ansonsten bleibt dir nichts anderes übrig als den Body manuell zu erzeugen.


    var fileToUpload = new FileInfo("DeineDatei.png");
    var boundary = string.Format("----------{0}", DateTime.Now.Ticks);
    var body = new StringBuilder();
    body.AppendLine(string.Format("\r\n{0}", boundary));
    body.AppendLine(string.Format("Content-Disposition: form-data; name=\"fn\"; filename=\"{0}\"", fileToUpload.Name));
    body.AppendLine(string.Format("Content-Type: {0}", MimeMapping.GetMimeMapping(fileToUpload.Name)));

    Das Bildet den "Header" des Body-Parts. Dieser wird dann einfach noch in ein Byte-Array umgewandelt und zusammen mit der Datei in den Request geschrieben. Aus Zeitgründen nicht getestet, sollte aber als Lösungsansatz taugen und im grob stimmen. Erfahrungsgemäß gibt es in dem Bereich ohnehin keine Patentlösung. Ich hatte früher viel mit Dateiuploads via HTTP zutun, je nach verwendeter Technologie und Implementation seitens des Dienstes gibt es da doch die eine oder andere Besonderheit. Besonders wenn du noch keine oder erst wenig Erfahrung in dem Gebiet hast, wird das ganze nicht auf Anhieb funktionieren. Das wichtigste ist hierbei genau zu arbeiten. Es reicht schon wenn irgendwo ein Zeilenumbruch fehlt oder zuviel ist, und schon funktioniert überhaupt nichts mehr.


  6. The Following User Says Thank You to DMW007 For This Useful Post:

    milchbubix (05.11.2015)

  7. #5
    Avatar von milchbubix
    Registriert seit
    06.12.2011
    Beiträge
    757
    Thanked 413 Times in 271 Posts

    Standard AW: Share-Online.biz Datei-Upload per API

    Geändert von milchbubix (11.11.2015 um 00:42 Uhr)


    Egal was du hast, es ist nie das was du willst.

    Denkbar finde ich auch, daß es außerirdische Lebensformen geben kann, die es darauf abgesehen haben, die Erde zu erobern, um sich hier anzusiedeln. Dabei wären die Menschen ja eher störend. Die Außerirdischen inszenieren dann solche Katastrophen wie 9/11 und legen falsche Spuren, um die Menschheit gegeneinander aufzuhetzen, damit sie sich selber ausrottet.


Diese Seite nutzt Cookies, um das Nutzererlebnis zu verbessern. Klicken Sie hier, um das Cookie-Tracking zu deaktivieren.