Laden...

Mit httpwebrequest bild per Post hochladen

Erstellt von kappos vor 15 Jahren Letzter Beitrag vor 15 Jahren 5.754 Views
K
kappos Themenstarter:in
13 Beiträge seit 2007
vor 15 Jahren
Mit httpwebrequest bild per Post hochladen

Hallo zusammen,
ich bin grad an meiner Studienarbeit und ich komm einfach nicht weiter.

Ich muss mich in einer Webpage einloggen und soll dann automatisch ein Photo hochladen können.
Einloggen tut wunderbar. Damit hab ich keine Probleme bekomm dann auch das richtige SessionCookie.
Allerdings habe ich bei dem Photo upload ein Problem.
Ich nutze die Klasse httpwebrequest und habe in google keine infos gefunden wie man per post einmal das SessionCookie, normale post paramater und dann das eigentlich bild noch schickt.
Kann mir da jemand helfen? Wäre voll Klasse.

Hier einmal das Webformular das ich per Post wegschicke:


   <form action="" method="post" enctype="multipart/form-data" class="narrowContent">
        <fieldset>
            <p><label for="foto_1">Foto 1:</label> <input class="fieldFile" type="file" size="22" id="foto_1" name="image[]" /></p>

            <p><label for="foto_2">Foto 2:</label> <input class="fieldFile" type="file" size="22" id="foto_2" name="image[]" /></p>
            <p><label for="foto_3">Foto 3:</label> <input class="fieldFile" type="file" size="22" id="foto_3" name="image[]" /></p>
            <p><label for="foto_4">Foto 4:</label> <input class="fieldFile" type="file" size="22" id="foto_4" name="image[]" /></p>
            <p><label for="foto_5">Foto 5:</label> <input class="fieldFile" type="file" size="22" id="foto_5" name="image[]" /></p>
            <input type="hidden" name="albumId" value="f2134a0e8b18805b" />

            <input type="hidden" name="formkey" value="086591eb23ff568aadce9017b9cdba3fc747e92123495fb487bd2a957e2a9075f3a9aafa01c9a8dbe77b8728d5ff6588bc4466af72b4a37e736e2e427e0c5c8e" />
<input type="hidden" name="iv" value="1ef7a1c6364061330b1cdf0c08e5ef97" />
<input type="hidden" name="checkcode" value="3c34b83b32d720824da92b1aa205cbb2" />
        </fieldset>
        <p><input class="fieldBtnSubmit" type="submit" name="upload" value="Hochladen" /> 
    </form>

Und hier jetzt meine Funktion.


  public static string UploadFileEx(string uploadfile, string url,
    string fileFormName, string contenttype, NameValueCollection querystring,
    CookieContainer cookies)
        {
            StringBuilder sb = new StringBuilder();
            StringBuilder sb2 = new StringBuilder();
            //string boundary = "----------" + DateTime.Now.Ticks.ToString("x");
            string boundary = "---------------------------37d81f5840d9e";
            string lastboundary = "---------------------------37d81f5840d9e--";

            if ((fileFormName == null) ||
                (fileFormName.Length == 0))
            {
                fileFormName = "file";
            }

            if ((contenttype == null) ||
                (contenttype.Length == 0))
            {
                contenttype = "application/octet-stream";
            }

            Uri uri = new Uri(url );

            System.Net.ServicePointManager.Expect100Continue = false;
            HttpWebRequest webrequest = (HttpWebRequest)WebRequest.Create(uri);
            webrequest.CookieContainer = cookies;
            webrequest.ContentType = "multipart/form-data; boundary=" + boundary;
            webrequest.Method = "POST";
           // webrequest.Accept="

            webrequest.UserAgent = "mozilla";
            webrequest.KeepAlive = true;
            webrequest.Timeout = 300000;
            webrequest.AllowAutoRedirect = false;
            webrequest.AutomaticDecompression = DecompressionMethods.GZip |
            DecompressionMethods.Deflate;

            webrequest.Accept = "text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5";
            //webrequest.SendChunked = true;
            //webrequest.TransferEncoding = "gzip/deflate";
           // webrequest.Headers.Add("Accept-Encoding", "gzip,deflate");
            //webrequest.Headers.Add("Accept-Charset", "ISO-8859-1,utf-8;q=0.7,*;q=0.7");
            //webrequest.Headers.Add("Keep-Alive", "300"); 
           // webrequest.Headers.Add("Connection", "Keep-Alive");
           
          //  webrequest.Expect = "";

            sb2.Append("\r\n");

            sb2.Append("--" + boundary + "\r\n" +
                    "Content-Disposition: form-data; name=\"" + "albumId" + "\" \r\n\r\n" +
                    querystring.Get("albumId") + "\r\n");

            sb2.Append("--" + boundary + "\r\n" +
                    "Content-Disposition: form-data; name=\"" + "formkey" + "\" \r\n\r\n" +
                    querystring.Get("formkey") + "\r\n");

            sb2.Append("--" + boundary + "\r\n" +
                    "Content-Disposition: form-data; name=\"" + "iv" + "\" \r\n\r\n" +
                    querystring.Get("iv") + "\r\n");

            sb2.Append("--" + boundary + "\r\n" +
                    "Content-Disposition: form-data; name=\"" + "checkcode" + "\" \r\n\r\n" +
                    querystring.Get("checkcode") + "\r\n");

            sb2.Append("--" + boundary + "\r\n" +
                    "Content-Disposition: form-data; name=\"" + "upload" + "\" \r\n\r\n" +
                    querystring.Get("upload"));
           

           /////
            string pp = sb2.ToString();
            byte[] ppByte = Encoding.UTF8.GetBytes(pp);


            // Build up the post message header
         

            sb.Append("--");
            sb.Append(boundary);
            sb.Append("\r\n");
            sb.Append("Content-Disposition: form-data; name=\"");
            sb.Append(fileFormName);
            sb.Append("\"; filename=\"");
            //sb.Append(Path.GetFileName(uploadfile));
            sb.Append("\"");
            //sb.Append("\r\n");
            sb.Append("\r\n");
            sb.Append("Content-Type: application/octet-stream");
            sb.Append("\r\n");
            sb.Append("\r\n");
            //sb.Append(contenttype);
            sb.Append("\r\n");

            sb.Append("--");
            sb.Append(boundary);
            sb.Append("\r\n");
            sb.Append("Content-Disposition: form-data; name=\"");
            sb.Append(fileFormName);
            sb.Append("\"; filename=\"");
            //sb.Append(Path.GetFileName(uploadfile));
            sb.Append("\"");
            //sb.Append("\r\n");
            sb.Append("\r\n");
            sb.Append("Content-Type: application/octet-stream");
            sb.Append("\r\n");
            sb.Append("\r\n");
            //sb.Append(contenttype);
            sb.Append("\r\n");

            sb.Append("--");
            sb.Append(boundary);
            sb.Append("\r\n");
            sb.Append("Content-Disposition: form-data; name=\"");
            sb.Append(fileFormName);
            sb.Append("\"; filename=\"");
            //sb.Append(Path.GetFileName(uploadfile));
            sb.Append("\"");
            //sb.Append("\r\n");
            sb.Append("\r\n");
            sb.Append("Content-Type: application/octet-stream");
            sb.Append("\r\n");
            sb.Append("\r\n");
            //sb.Append(contenttype);
            sb.Append("\r\n");

            sb.Append("--");
            sb.Append(boundary);
            sb.Append("\r\n");
            sb.Append("Content-Disposition: form-data; name=\"");
            sb.Append(fileFormName);
            sb.Append("\"; filename=\"");
            //sb.Append(Path.GetFileName(uploadfile));
            sb.Append("\"");
            //sb.Append("\r\n");
            sb.Append("\r\n");
            sb.Append("Content-Type: application/octet-stream");
            sb.Append("\r\n");
            sb.Append("\r\n");
            //sb.Append(contenttype);
            sb.Append("\r\n");

         

            ///
            sb.Append("--");
            sb.Append(boundary);
            sb.Append("\r\n");
            sb.Append("Content-Disposition: form-data; name=\"");
            sb.Append(fileFormName);
            sb.Append("\"; filename=\"");
            //sb.Append(Path.GetFileName(uploadfile));
            sb.Append("C:\\test.jpg");
            sb.Append("\"");
            sb.Append("\r\n");
            sb.Append("Content-Type: ");
            sb.Append(contenttype);
            sb.Append("\r\n");
            sb.Append("\r\n");


            string postHeader = sb.ToString();
            byte[] postHeaderBytes = Encoding.UTF8.GetBytes(postHeader);

            // Build the trailing boundary string as a byte array

            // ensuring the boundary appears on a line by itself

            byte[] boundaryBytes =
                   Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n");
            byte[] lastboundaryBytes = Encoding.ASCII.GetBytes("\r\n--" + lastboundary + "\r\n");

            FileStream fileStream = new FileStream(uploadfile,
                                        FileMode.Open, FileAccess.Read);
            long length = postHeaderBytes.Length + fileStream.Length +
                                                   lastboundaryBytes.Length + ppByte.Length ; 
            webrequest.ContentLength = length;

            Stream requestStream = webrequest.GetRequestStream();

            // Write out our post header
           
            requestStream.Write(postHeaderBytes, 0, postHeaderBytes.Length);

            // Write out the file contents

            byte[] buffer = new Byte[checked((uint)Math.Min(4096,
                                     (int)fileStream.Length))];
            int bytesRead = 0;
            while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0)
                requestStream.Write(buffer, 0, bytesRead);

            

            requestStream.Write(ppByte, 0, ppByte.Length);
            // Write out the trailing boundary
            requestStream.Write(lastboundaryBytes, 0, lastboundaryBytes.Length);
            

            WebResponse responce = webrequest.GetResponse();
            Stream s = responce.GetResponseStream();
            StreamReader sr = new StreamReader(s);
            responce.Close();
            return sr.ReadToEnd();
        }

Ich denke das die normalen Post parameter sprich albumid iv checkcode usw. nicht richtig übertragen werden. Mach ich da was falsch?

A
12 Beiträge seit 2008
vor 15 Jahren

Es gibt das Control

System.Web.UI.WebControls.FileUpload

... kannst Du das nicht verwenden ?

Gruß

Achim

K
kappos Themenstarter:in
13 Beiträge seit 2007
vor 15 Jahren

Das hab ich mir gerade angeschaut aber das funktioniert doch nur mit asp seiten oder?
Bei mir steckt eine php anwendung dahinter.

A
12 Beiträge seit 2008
vor 15 Jahren

OK - sorry. Das geht natürlich nur mit ASP.

Gruß

Achim

J
222 Beiträge seit 2006
vor 15 Jahren

wie wärs mit :


   <input id="File1" type="file" />
  <input id="Submit1" type="submit" value="submit" />

danach kansnt du mit php deine file operation ausführen


<?php
  if(isset($_POST['submit']))
  {
    /* php code
  }
?>

is ungetestet da ich schon lange nix mehr mache mit php ...

4.506 Beiträge seit 2004
vor 15 Jahren

Hallo zusammen,

einmal hier eine wichtige Quelle:
Microsoft - Verwenden der System.NET Klassen

Und speziell für den Upload von Dateien kann ich folgendes empfehlen:
http://forums.msdn.microsoft.com/en-US/netfxnetcom/thread/99c470a0-32b7-4757-9851-85a9ce138f3c/
Dort wird mit Quellcode demonstriert, wie man Dateianhänge verschicken kann.

Kurzum Multipart Formular-Uploads werden nicht standardmäßig mit .NET unterstützt, so dass man das wirklich mittels HttpWebRequest und dem "zusammenbasteln" des Request-Strings selbst erledigen muss.

Viele Grüße
Norman-Timo

A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”

K
kappos Themenstarter:in
13 Beiträge seit 2007
vor 15 Jahren

Erstmal danke für die Antworten.
@norman_timo danke für die links die sind sehr hilfreich
allerdings mach ich mehr oder weniger genau das gleiche in meinem Code.
Oder seh ich das falsch?
Kann sich einer meinen Code anschauen? irgendwie hab ich das Gefühl
das ich kurz vor dem Ziel bin aber voll auf dem Schlauch steh.
Grüße
Felix

4.506 Beiträge seit 2004
vor 15 Jahren

Hallo kappos,

sorry, ich habe für's Code-durchschauen gerade keine Zeit, kann Dir aber einen Tipp geben:

Versuche doch mal den Code aus meinem verlinkten Post zu nehmen, und dort Deine Datei hochzuladen. Sollte das klappen, dann lasse Dir den Output anzeigen (oder in ein Textfile speichern) und vergleiche das mit dem Output aus Deinem Code.

Ich gehe jetzt blind davon aus, dass zwar Deine Vorgehensweise dem Funktionierenden entspricht, aber wahrscheinlich irgendwo noch Fehler in der Post-Antwort zu finden sind.

Grüße
Norman-Timo

A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”

K
kappos Themenstarter:in
13 Beiträge seit 2007
vor 15 Jahren

Hallo zusammen,
nachdem jetzt meine Prüfungen vorbei sind kann ich mich endlich wieder voll der Studienarbeit wittmen. Ich bin nen stück weiter gekommen.
Ich habe mir jetzt das ganze selber mit php die Homepage nachgebaut und habe gemerkt das der eigentlich Bild upload funktioniert nur verhauts mir die anderen Postdaten.


sb2.Append("\r\n");

            sb2.Append("--" + boundary + "\r\n" +
                    "Content-Disposition: form-data; name=\"" + "albumId" + "\" \r\n\r\n" +
                    querystring.Get("albumId") + "\r\n");


Das scheint falsch zu sein wenn ich mir in meinem Php Skript die Postdaten anzeigen lass dann kommt sowas:


Array ( [albumId\"_] => test [formkey\"_] => [iv\"_] => [checkcode\"_] => [upload\"_] => -----------------------------37d81f5840d9e Content-Disposition: form-data; name=\"image[]\"; filename=\"\" Content-Type: image/pjpeg 

Da verhauts mir irgendwie die Daten. Weiß jemand warum?

Wär Klasse wenn mir da jemand helfen könnte.

Grüße
Felix

K
kappos Themenstarter:in
13 Beiträge seit 2007
vor 15 Jahren

So habs nun endlich hinbekommen.
Für alle die das gleiche Problem haben nun hier meine fertige funktion


 public string UploadFileEx(string uploadfile, string url,
        string fileFormName, string contenttype, NameValueCollection querystring,
        CookieContainer cookies)
        {
            StringBuilder sb = new StringBuilder();
            StringBuilder sb2 = new StringBuilder();
            string boundary = "---------------------------37d81f5840d9e";
            string lastboundary = "---------------------------37d81f5840d9e--";

            if ((fileFormName == null) ||
                (fileFormName.Length == 0))
            {
                fileFormName = "file";
            }

            if ((contenttype == null) ||
                (contenttype.Length == 0))
            {
                contenttype = "application/octet-stream";
            }

            System.Net.ServicePointManager.Expect100Continue = false;
            this.request = (HttpWebRequest)WebRequest.Create(url);
            this.request.CookieContainer = cookies;
            this.request.ContentType = "multipart/form-data; boundary=" + boundary;
            this.request.Method = "POST";
            this.request.UserAgent = "mozilla";
            this.request.KeepAlive = true;
            this.request.Timeout = 300000;
            this.request.AllowAutoRedirect = false;
            this.request.AutomaticDecompression = DecompressionMethods.GZip |
            DecompressionMethods.Deflate;
            this.request.Accept = "text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5";

            //Normale Postdaten zusammenbauen
            sb2.Append("\r\n");
            sb2.Append("--" + boundary + "\r\n");
            sb2.Append("Content-Disposition: form-data; name=\"" + "albumId" + "\"" + "\r\n\r\n");
            sb2.Append(querystring.Get("albumId") + "\r\n");
            sb2.Append("--" + boundary + "\r\n");
            sb2.Append("--" + boundary + "\r\n");
            sb2.Append("Content-Disposition: form-data; name=\"" + "formkey" + "\"" + "\r\n\r\n");
            sb2.Append(querystring.Get("formkey") + "\r\n");
            sb2.Append("--" + boundary + "\r\n");
            sb2.Append("--" + boundary + "\r\n");
            sb2.Append("Content-Disposition: form-data; name=\"" + "iv" + "\"" + "\r\n\r\n");
            sb2.Append(querystring.Get("iv") + "\r\n");
            sb2.Append("--" + boundary + "\r\n");
            sb2.Append("--" + boundary + "\r\n");
            sb2.Append("Content-Disposition: form-data; name=\"" + "checkcode" + "\"" + "\r\n\r\n");
            sb2.Append(querystring.Get("checkcode") + "\r\n");
            sb2.Append("--" + boundary + "\r\n");
            sb2.Append("--" + boundary + "\r\n");
            sb2.Append("Content-Disposition: form-data; name=\"" + "upload" + "\"" + "\r\n\r\n");
            sb2.Append(querystring.Get("upload") + "\r\n");
            sb2.Append("--" + boundary + "\r\n");
            // Postdaten für ddas Bild zusammenbauen
            sb.Append("--");
            sb.Append(boundary);
            sb.Append("\r\n");
            sb.Append("Content-Disposition: form-data; name=\"");
            sb.Append(fileFormName);
            sb.Append("\"; filename=\"");
            sb.Append("\"");
            sb.Append("\r\n");
            sb.Append("Content-Type: image/pjpeg");
            sb.Append("\r\n");
            sb.Append("\r\n");
            sb.Append("\r\n");

            sb.Append("--");
            sb.Append(boundary);
            sb.Append("\r\n");
            sb.Append("Content-Disposition: form-data; name=\"");
            sb.Append(fileFormName);
            sb.Append("\"; filename=\"");
            sb.Append("\"");
            sb.Append("\r\n");
            sb.Append("Content-Type: image/pjpeg");
            sb.Append("\r\n");
            sb.Append("\r\n");
            sb.Append("\r\n");

            sb.Append("--");
            sb.Append(boundary);
            sb.Append("\r\n");
            sb.Append("Content-Disposition: form-data; name=\"");
            sb.Append(fileFormName);
            sb.Append("\"; filename=\"");
            sb.Append("\"");
            sb.Append("\r\n");
            sb.Append("Content-Type: image/pjpeg");
            sb.Append("\r\n");
            sb.Append("\r\n");
            sb.Append("\r\n");

            sb.Append("--");
            sb.Append(boundary);
            sb.Append("\r\n");
            sb.Append("Content-Disposition: form-data; name=\"");
            sb.Append(fileFormName);
            sb.Append("\"; filename=\"");
            sb.Append("\"");
            sb.Append("\r\n");
            sb.Append("Content-Type: image/pjpeg");
            sb.Append("\r\n");
            sb.Append("\r\n");
            sb.Append("\r\n");

            sb.Append("--");
            sb.Append(boundary);
            sb.Append("\r\n");
            sb.Append("Content-Disposition: form-data; name=\"");
            sb.Append(fileFormName);
            sb.Append("\"; filename=\"");
            sb.Append("C:\\test.jpg");
            sb.Append("\"");
            sb.Append("\r\n");
            sb.Append("Content-Type: image/pjpeg ");
            sb.Append("\r\n");
            sb.Append("\r\n");
            //Postdaten umwandeln in bytes
            byte[] ppByte = Encoding.UTF8.GetBytes(sb2.ToString());  
            byte[] postHeaderBytes = Encoding.UTF8.GetBytes(sb.ToString());
            //BoundaryBytes erstellen
            byte[] boundaryBytes = Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n");
            byte[] lastboundaryBytes = Encoding.ASCII.GetBytes("\r\n--" + lastboundary + "\r\n");
            //Bilddatei oeffnen
            FileStream fileStream = new FileStream(uploadfile,FileMode.Open, FileAccess.Read);
            //Length der zu sendenden Daten bestimmen und an request objekt uebergeben
            long length = postHeaderBytes.Length + fileStream.Length + lastboundaryBytes.Length + ppByte.Length ;
            this.request.ContentLength = length;
            //Stream zum senden oeffnen
            Stream requestStream = this.request.GetRequestStream();
            // Daten senden
            requestStream.Write(postHeaderBytes, 0, postHeaderBytes.Length);

            byte[] buffer = new Byte[checked((uint)Math.Min(4096,(int)fileStream.Length))];
            int bytesRead = 0;
            while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0)
                requestStream.Write(buffer, 0, bytesRead);
            requestStream.Write(ppByte, 0, ppByte.Length);
            //letzten boundary senden
            requestStream.Write(lastboundaryBytes, 0, lastboundaryBytes.Length);
            //Response auslesen
            this.response = (HttpWebResponse) this.request.GetResponse();
            Stream s = this.response.GetResponseStream();
            StreamReader sr = new StreamReader(s);
            String antwort = sr.ReadToEnd();
            this.response.Close();
            return antwort;
        }