C#HttpWebRequest表单上传
我正在尝试从我的C#程序自动上传文件。这是上载文件的方法C#HttpWebRequest表单上传,c#,forms,upload,httpwebrequest,C#,Forms,Upload,Httpwebrequest,我正在尝试从我的C#程序自动上传文件。这是上载文件的方法 public static string UploadFileEx(string uploadfile, string url, string fileFormName, string contenttype, NameValueCollection querystring, CookieContainer cookies)
public static string UploadFileEx(string uploadfile, string url,
string fileFormName, string contenttype, NameValueCollection querystring,
CookieContainer cookies)
{
if ((fileFormName == null) ||
(fileFormName.Length == 0))
{
fileFormName = "file";
}
if ((contenttype == null) ||
(contenttype.Length == 0))
{
contenttype = "application/octet-stream";
}
string postdata;
postdata = "";
if (querystring != null)
{
foreach (string key in querystring.Keys)
{
postdata += key + "=" + querystring.Get(key) + "&";
}
}
Uri uri = new Uri(url + postdata);
string boundary = "----------" + DateTime.Now.Ticks.ToString("x");
HttpWebRequest webrequest = (HttpWebRequest)WebRequest.Create(uri);
var sp = webrequest.ServicePoint;
var prop = sp.GetType().GetProperty("HttpBehaviour", BindingFlags.Instance | BindingFlags.NonPublic);
prop.SetValue(sp, (byte)0, null);
webrequest.CookieContainer = cookies;
webrequest.ContentType = "multipart/form-data; boundary=" + boundary;
webrequest.Method = "POST";
webrequest.KeepAlive = true;
webrequest.Referer = "http://www.iwi.hs-karlsruhe.de/scs/simulate/upload.jsp";
webrequest.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
webrequest.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.220 Safari/535.1";
webrequest.Headers.Add("Accept-Language:de-de,de;q=0.8,en-us;q=0.5,en;q=0.3");
webrequest.Headers.Add("Accept-Encoding:gzip, deflate");
webrequest.ProtocolVersion = HttpVersion.Version11;
// Build up the post message header
StringBuilder sb = new StringBuilder();
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("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");
FileStream fileStream = new FileStream(uploadfile,
FileMode.Open, FileAccess.Read);
long length = postHeaderBytes.Length + fileStream.Length +
boundaryBytes.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);
// Write out the trailing boundary
requestStream.Write(boundaryBytes, 0, boundaryBytes.Length);
try
{
WebResponse responce = webrequest.GetResponse();
Stream s = responce.GetResponseStream();
StreamReader sr = new StreamReader(s);
return sr.ReadToEnd();
}
catch (Exception ex)
{
return ex.Message;
}
}
当我在示例图像上传页面上这样称呼它时,一切正常:
string outdata = UploadFileEx(uploadfile,
"http://www.minpic.de/upload_file.php", "uploadfile0", "image/jpg",
null, null);
但是当我试图上传到我高中的网页时,它不起作用。上载页面由登录表单保护。因此,我调用上载页面以获取initailcookie,然后发布登录凭据并获得正确的结果。因此,我可以看到以下上传表单:
<form action="../simulate" method=post enctype="multipart/form-data"><br />Choose your inputdata file (xml).<br /><input type=file size=50 maxlength=100000 name="Datei" accept="text/xml"><br><br><input type=submit value="Send"></form>
选择您的输入数据文件(xml)。
然后,当我发布图像时(我知道预期的类型是xml,但页面回答了一个错误,这是我想要的…),我的上载函数返回一个错误代码500。以下是wireshark对浏览器帖子的评论:
POST/scs/simulate HTTP/1.1
主持人:某位主持人
连接:保持活力
内容长度:3874
缓存控制:最大年龄=0
来源:同一主机
用户代理:Mozilla/5.0(Windows NT 6.1)AppleWebKit/537.4(KHTML,如Gecko)Chrome/22.0.1229.79 Safari/537.4
内容类型:多部分/表单数据;边界=----WebKitFormBoundaryP3Ti6rxYcN1ov7JD
接受:text/html、application/xhtml+xml、application/xml;q=0.9,/;q=0.8
推荐人:一些网址
接受编码:gzip、deflate、sdch
接受语言:德德,德;q=0.8,在美国;q=0.6,en;q=0.4
接受字符集:ISO-8859-1,utf-8;q=0.7,*;q=0.3
Cookie:SCS_Cookie=Default=DE$$MarkePlaceLang=DE;JSESSIONID=B459541362241F66D9312AF157262D25
这里是来自c#的帖子:
职位同上
内容类型:多部分/表单数据;边界=------------8cf828671b8365c
推荐人:一些网址
接受:text/html、application/xhtml+xml、application/xml;q=0.9,/;q=0.8
用户代理:Mozilla/5.0(Windows NT 6.1;WOW64)AppleWebKit/535.1(KHTML,如Gecko)Chrome/13.0.782.220 Safari/535.1
接受语言:德德,德;q=0.8,在美国;q=0.5,en;q=0.3
接受编码:gzip,deflate
主机:与上述主机相同
Cookie:JSESSIONID=FFE0B7530FFE6A3C8F15FD8A900865B0
内容长度:3847
预期:100人继续
连接:保持活力
我能看到的唯一不同是期望:100继续。。。数据包大小有问题吗
Thx提前。您必须使用多部分上传。这将显示在您的浏览器帖子中:
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryP3Ti6rxYcN1ov7JD
以下是一个例子:
这是有道理的,因为通常图像大小可能会大于通常帖子的限制(我忘记了2KB或4KB)。但我在浏览器和C#post中都有“内容类型:多部分/表单数据”。