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?
Es gibt das Control
System.Web.UI.WebControls.FileUpload
... kannst Du das nicht verwenden ?
Gruß
Achim
Das hab ich mir gerade angeschaut aber das funktioniert doch nur mit asp seiten oder?
Bei mir steckt eine php anwendung dahinter.
OK - sorry. Das geht natürlich nur mit ASP.
Gruß
Achim
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 ...
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!”
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
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!”
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
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;
}