c# 模拟提交带文件上传的表单
------WebKitFormBoundary8gsfyexbIoO5OYAaContent-Disposition:form-data;name="username"admin------WebKitFormBoundary8gsfyexbIoO5OYAaContent-Disposition:form-data;name="submit"登录------WebKitFormBoundary8gsfyexbIoO5OYAaContent-Disposition:form-data;name="MAX_FILE_SIZE";filename="2aêo1üàí.txt"Content-Type:text/plain//未识别的文件格式,如rar为Content-Type:application/octet-stream。pdf则为Content-Type:application/pdf------WebKitFormBoundary8gsfyexbIoO5OYAa--
请求数据流格式为:------固定边界字符//1、该边界字符与请求头中一致Content-Type:multipart/form-data;boundary=----WebKitFormBoundaryXXBQdgnAyMZzuaXZContent-Disposition:form-data;name="username"//2、内容描述与内容名称//2.1、若上传文件则需要填写文件类型Content-Type:text/plain//3、空行//4、字符串或文件二进制//若有其他数据需要提交则重复1-4------固定边界字符//5、在最后应添加边界结尾
c# 模拟上传文件代码
publicPostFile(stringaction,stringfile){//1、数据边界stringboundary="---------------------------"+DateTime.Now.Ticks.ToString("x");//2、创建HttpWebRequest请求HttpWebRequestmyRequest=WebRequest.Create(action)asHttpWebRequest;myRequest.Method="POST";//3、设置请求ContentType和边界字符(边界字符必须和请求数据体的边界字符一致否则服务器无法解析)myRequest.ContentType="multipart/form-data;boundary="+boundary;//4、添加文件数据描述信息StringBuildersb=newStringBuilder();sb.Append("--"+boundary);sb.Append("\r\n");//name为上传文件的inputnamesb.Append("Content-Disposition:form-data;name='MAX_FILE_SIZE';filename=\""+file+"\"");sb.Append("\r\n");sb.Append("Content-Type:application/octet-stream");//此处则为模拟的文件类型,实际情况下浏览器会根据本地文件后缀名判断此类型sb.Append("\r\n\r\n");Encodingencoding=Encoding.GetEncoding("gbk");//此处编码须与网页编码一直否则导致中文路径或文件名乱码但文件内容不会乱码byte[]form_data=encoding.GetBytes(sb.ToString());//5、表尾数据byte[]foot_data=encoding.GetBytes("\r\n--"+boundary+"--\r\n");//6、读取文件using(FileStreamfileStream=newFileStream(file,FileMode.Open,FileAccess.Read)){StringBuildersb2=newStringBuilder();sb2.Append("--"+boundary);sb2.Append("\r\n");sb2.Append("Content-Disposition:form-data;name='username';\r\n");//发送的内容标题sb2.Append("\r\n");sb2.Append("中文名称");//发送的内容sb2.Append("\r\n");//每一组数据结束都需要添加换行字符sb2.Append("--"+boundary);sb2.Append("\r\n");sb2.Append("Content-Disposition:form-data;name='pwd';\r\n");sb2.Append("\r\n");sb2.Append("QADSFDSFA");sb2.Append("\r\n");byte[]data=encoding.GetBytes(sb2.ToString());//6、设置上传数据长度为表头+文件+表尾长度myRequest.ContentLength=form_data.Length+foot_data.Length+fileStream.Length+data.Length;//7、得到请求的数据流StreamrequestStream=myRequest.GetRequestStream();//8.1、将字符信息数据写入请求流requestStream.Write(data,0,data.Length);//8.2、将文件信息数据写入请求流requestStream.Write(form_data,0,form_data.Length);//9、循环读取文件流并写入请求流byte[]buffer=newByte[checked((uint)Math.Min(4096,(int)fileStream.Length))];intbytesRead=0;while((bytesRead=fileStream.Read(buffer,0,buffer.Length))!=0){requestStream.Write(buffer,0,bytesRead);}//10、将结束边界数据写入请求流requestStream.Write(foot_data,0,foot_data.Length);}//11、发起请求HttpWebResponsemyResponse=myRequest.GetResponse()asHttpWebResponse;//12、读取请求返回的数据流StreamReadersr=newStreamReader(myResponse.GetResponseStream(),encoding);stringjson=sr.ReadToEnd().Trim();Clipboard.SetText(json);MessageBox.Show(json);}
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。