PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [C#] Hilfe bei File Upload



Guardian Angel
16.04.2012, 18:38
Also ich beschäftige mich seit einigen Tagen mit C# und möchte jetzt folgende API benutzen um eine Datei hochzuladen:
http://www.share-online.biz/uploadapi/

Der erste Schritt (Create Upload Session) funktioniert bei mir

Wer den Code haben will kann mich anschreiben:)

Wie man sicher merkt ist sind diese Funktionen nicht aus meiner eigenen Feder entstanden sondern mehr oder weniger Copy&Paste.

Jetzt weiß ich nicht, wie ich den zweiten Schritt(also den eigentlichen FileUpload) angehen soll...
Vllt könnt ihr mir ja einen Denkanstoß in die richtige Richtung geben

MfG
Guardian Angel

P.S.:
ja ich weiß, dass SO ein upload tool anbietet aber ich möchte das gerne selber schaffen um daran zu lernen :)

Easysurfer
16.04.2012, 19:07
Also, alle Daten werden per POST übergeben, ich würde Dir also Raten eine eigene Funktion für SendPOST(String URL, String POSTData) zu schreiben, macht das ganze vieeel übersichtlicher =)

Aber ok, während die Session nur Username+PW verwendet brauchst Du in der Upload-Funktion folgende Parameter:


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"

Die Username, Password und Session hast Du ja schon, jetzt brauchst Du die Chuck_no (welche 1 ist, da wir keine Chunks verwenden), genau wie die ChunkNumber (auch 1). Die Filesize wird einfach auf die größe des Files gesetzt (FileStream.Length, bzw dein arFile.Length) und schließlich folgen die Daten, ich nehme an einfach Normal ASCII-Codiert. ( = Encoding.ASCII.GetString(arFile)). Finalize wird auf 1 gesetzt -> fertig, du erhälst einen Link zum File und einen MD5 Hash zurück =).

Ich hab Dir mit Absicht nur Stichworte hingeworfen, Du willst ja lernen. Wenn Du fragen zum einlesen des Files etc. hast kann ich gerne helfen, wollte nur nicht alles vorkauen =)

Greez Easy

Guardian Angel
16.04.2012, 20:43
Erstmal vielen Dank für die ganzen Anregungen :)

Bei mir siehts mitlerweile so aus (ich hab noch eine Funktion zum anzeigen von allen .rar dateien in einem ordner "geschrieben"):

Wer den Code haben will kann mich anschreiben :)soweit klappt auch alles. Allerdings kommt bei dem FileUpload
folgende Meldung: "Der Remoteserver hat einen Fehler zurückgegeben: (415) Unsupported Media Type."
und zwar bei Folgender Zeile in der SendPOST funktion:

// Get the response.
WebResponse response = request.GetResponse();Ich nehme an, dass es damit zusammenhängt, dass ich nicht weiß, wie ich "ich nehme an einfach Normal ASCII-Codiert. ( = Encoding.ASCII.GetString(arFile))" umsetzen kann.
Vllt kann mir da ja jmd helfen :)

MfG

Easysurfer
16.04.2012, 21:41
Du programmierst erst seid wenigen Tagen in C# ? Dafür ist der Source aber doch sehr sehr gut, nice :D

Ok, mein Fehler, ich hab nicht weit genug gedacht. Der Server hat keine Ahnung wie er mit dem File das ankommt umgehen soll. Daher gibt es in dem HTTP-Header die sog. Content-Type Eigenschaft, z.B:


Content-Type: text/plain

Diese sog. MIME-Typen findest Du unter anderem hier (http://www.iana.org/assignments/media-types/index.html). Diesen MIME-Type setzt Du einfach in deiner HttpWebRequest.

Das schnellste wird sein wenn Du einen simplen Fileupload über den Browser (ohne Flash und Javasciptkomponenten) mitsniffst, da findest Du genau wie der Type aussieht und die die gesammte POST-Request aufgebaut ist.

Spiele mit dem Type ein bisschen rum, nehme für den Anfang mal application/pdf oder so. Wenn nicht schau Dir mal das RCF zum Fileupload an... (http://www.ietf.org/rfc/rfc1867.txt) Mit diesen Infos solltest Du jetzt weiterkommen, viel Spass

Greez Easy

Guardian Angel
17.04.2012, 15:57
Du programmierst erst seid wenigen Tagen in C# ? Dafür ist der Source aber doch sehr sehr gut, nice :D
Erstmal Danke :) liegt aber wohl daran, dass ich schon in C++ Objektorientiert programmiert habe :D Konnte mich deswegen relativ schnell wieder einfühlen.

Zu meinem (erneuten Problem)
Also ich hab jetzt per "Live HTTP Headers" den Upload mitverfolgt.

den Content-type habe ich aber anhand der Webform auf der API-Seite "herausgefunden"

Nun habe ich folgendes Problem:
"Die zugrunde liegende Verbindung wurde geschlossen: Die Verbindung wurde unerwartet getrennt.."
Und zwar an folgender Stelle:

// Get the request stream.
Stream dataStream = request.GetRequestStream();Ich dachte, dass es daran liegt, dass keine persistente Verbindung besteht, das habe ich aber meiner Meinung nach mit

//Persistente Verbindung aufbauen
request.KeepAlive = false;gelöst.

Google hilft mir bei der Problematik erstaunlich wenig weiter...
vllt kannst du mir ja noch einmal helfen :)

MfG

inout
17.04.2012, 18:19
Wenn du eine Datei senden möchtest, muss der Content-Type afaik multipart/form-data und nicht application/x-www-form-urlencoded sein. Zudem musst du ein boundary angeben und die Parameter in folgender Form versenden, gefolgt vom Inhalt der Datei.


------------hier der boundary string
Content-Disposition: form-data; name="hier der Parameter"

hier der Inhalt


Ich schlage vor du schreibst dir neben SendPOST eine weitere Funktion SendPostFile und passt es da entsprechend an.

Guardian Angel
17.04.2012, 23:19
Mit Hilfe von Easysurfer und einer langen IRC-Sitzung hab ichs schlussendlich hinbekommen :D

vielen Dank dafür an ihn und danke an inout :)



Wer den Code haben will kann mich anschreiben :)

MfG
G A