配色: 字号:
Asp
2016-10-22 | 阅:  转:  |  分享 
  
Asp.Net模拟表单提交数据和上传文件的实现代码

这篇文章主要介绍了Asp.Net模拟表单提交数据和上传文件的实现代码,本文对3种情况都做了介绍,只有普通数据的表单、只上传文件的表单、包含普通数据和上传文件表单,需要的朋友可以参考下

如果你需要跨域上传内容到另外一个域名并且需要获取返回值,使用Asp.Net的作为代理是最好的办法,要是客户端直接提交到iframe中,由于跨域是无法用javascript获取到iframe中返回的内容的。此时需要在自己的网站做一个动态页作为代理,将表单提交到动态页,动态页负责将表单的内容使用WebClient或HttpWebRequest将表单数据再上传到远程服务器,由于在服务器端进行操作,就不存在跨域问题了。



WebClient上传只包含键值对的文本信息示例代码:





复制代码代码如下:





stringuriString="localhost/login.aspx";

//创建一个新的WebClient实例.

WebClientmyWebClient=newWebClient();

stringpostData="Username=admin&Password=admin";

//注意这种拼字符串的ContentType

myWebClient.Headers.Add("Content-Type","application/x-www-form-urlencoded");

//转化成二进制数组

byte[]byteArray=Encoding.ASCII.GetBytes(postData);

//上传数据,并获取返回的二进制数据.

byte[]responseArray=myWebClient.UploadData(uriString,"POST",byteArray);







WebClient上传只包含文件的示例代码:





复制代码代码如下:





StringuriString="localhost/uploadFile.aspx";

//创建一个新的WebClient实例.

WebClientmyWebClient=newWebClient();

stringfileName=@"C:/upload.txt";

//直接上传,并获取返回的二进制数据.

byte[]responseArray=myWebClient.UploadFile(uriString,"POST",fileName);







对于既包含文件又包含文本键值对信息的示例代码,需要构造表单提交的内容,对于学asp的同学来说,下面的表单提交内容一定不会陌生





复制代码代码如下:





-----------------------------7d429871607fe

Content-Disposition:form-data;name="file1";filename="G:/homepage.txt"

Content-Type:text/plain

-----------------------------7d429871607fe

Content-Disposition:form-data;name="filename"

defaultfilename

-----------------------------7d429871607fe--







所以只要拼一个这样的byte[]data数据Post过去,就可以达到同样的效果了。但是一定要注意,对于这种带有文件上传的,其ContentType是不一样的,例如上面的这种,其ContentType为"multipart/form-data;boundary=---------------------------7d429871607fe"。有了ContentType,我们就可以知道boundary(就是上面的"---------------------------7d429871607fe"),知道boundary了我们就可以构造出我们所需要的byte[]data了,最后,不要忘记,把我们构造的ContentType传到WebClient中(例如:webClient.Headers.Add("Content-Type",ContentType);)这样,就可以通过WebClient.UploadData方法上载文件数据了。



usingSystem;usingSystem.Web;usingSystem.IO;usingSystem.Net;usingSystem.Text;usingSystem.Collections;namespaceUploadData.Common{publicclassCreateBytes{Encodingencoding=Encoding.UTF8;publicwww.visa158.comes(ArrayListbyteArrays){intlength=0;intreadLength=0;//加上结束边界stringendBoundary=Boundary+"--";byte[]endBoundaryBytes=encoding.GetBytes(endBoundary);byteArrays.Add(endBoundaryBytes);foreach(byte[]binbyteArrays){length+=b.Length;}byte[]bytes=newbyte[length];//遍历复制foreach(byte[]binbyteArrays){b.CopyTo(bytes,readLength);readLength+=b.Length;}returnbytes;}publicboolUploadData(stringuploadUrl,byte[]bytes,outbyte[]responseBytes){WebClientwebClient=newWebClient();webClient.Headers.Add("Content-Type",ContentType);try{responseBytes=webClient.UploadData(uploadUrl,bytes);returntrue;}catch(WebExceptionex){Streamresp=ex.Response.GetResponseStream();responseBytes=newbyte[ex.Response.ContentLength];resp.Read(responseBytes,0,responseBytes.Length);}returnfalse;}///获取普通表单区域二进制数组publicbyte[]CreateFieldData(stringfieldName,stringfieldValue){stringtextTemplate=Boundary+"Content-Disposition:form-data;name="{0}"{1}";stringtext=String.Format(textTemplate,fieldName,fieldValue);byte[]bytes=encoding.GetBytes(text);returnbytes;}publicbyte[]CreateFieldData(stringfieldName,stringfilename,stringcontentType,byte[]fileBytes){stringend="";stringtextTemplate=Boundary+"Content-Disposition:form-data;name="{0}";filename="{1}"Content-Type:{2}";//头数据stringdata=String.Format(textTemplate,fieldName,filename,contentType);byte[]bytes=encoding.GetBytes(data);//尾数据byte[]endBytes=encoding.GetBytes(end);//合成后的数组byte[]fieldData=newbyte[bytes.Length+fileBytes.Length+endBytes.Length];bytes.CopyTo(fieldData,0);//头数据fileBytes.CopyTo(fieldData,bytes.Length);//文件的二进制数据endBytes.CopyTo(fieldData,bytes.Length+fileBytes.Length);//returnfieldData;}publicstringBoundary{get{string[]bArray,ctArray;stringcontentType=ContentType;ctArray=contentType.Split('';'');if(ctArray[0].Trim().ToLower()=="multipart/form-data"){bArray=ctArray[1].Split(''='');return"--"+bArray[1];}returnnull;}}publicstringContentType{get{if(HttpContext.Current==null){return"multipart/form-data;boundary=---------------------------7d5b915500cee";}returnHttpContext.Current.Request.ContentType;}}}}usingSystem;usingSystem.Drawing;usingSystem.Collections;usingSystem.ComponentModel;usingSystem.Windows.Forms;usingSystem.Data;usingUploadData.Common;usingSystem.IO;namespaceUploadDataWin{publicclassfrmUpload:System.Windows.Forms.Form{privateSystem.Windows.Forms.LabellblAmigoToken;privateSystem.Windows.Forms.TextBoxtxtAmigoToken;privateSystem.Windows.Forms.LabellblFilename;privateSystem.Windows.Forms.TextBoxtxtFilename;privateSystem.Windows.Forms.ButtonbtnBrowse;privateSystem.Windows.Forms.TextBoxtxtFileData;privateSystem.Windows.Forms.LabellblFileData;privateSystem.Windows.Forms.ButtonbtnUpload;privateSystem.Windows.Forms.OpenFileDialogopenFileDialog1;privateSystem.Windows.Forms.TextBoxtxtResponse;privateSystem.ComponentModel.Containercomponents=null;publicfrmUpload(){InitializeComponent();}protectedoverridevoidDispose(booldisposing){if(disposing){if(components!=null){components.Dispose();}}base.Dispose(disposing);}privatevoidInitializeComponent(){this.lblAmigoToken=newSystem.Windows.Forms.Label();this.txtAmigoToken=newSystem.Windows.Forms.TextBox();this.lblFilename=newSystem.Windows.Forms.Label();this.txtFilename=newSystem.Windows.Forms.TextBox();this.btnBrowse=newSystem.Windows.Forms.Button();this.txtFileData=newSystem.Windows.Forms.TextBox();this.lblFileData=newSystem.Windows.Forms.Label();this.btnUpload=newSystem.Windows.Forms.Button();this.openFileDialog1=newSystem.Windows.Forms.OpenFileDialog();this.txtResponse=newSystem.Windows.Forms.TextBox();this.SuspendLayout();////lblAmigoToken//this.lblAmigoToken.Location=newSystem.Drawing.Point(40,48);this.lblAmigoToken.Name="lblAmigoToken";this.lblAmigoToken.Size=newSystem.Drawing.Size(72,23);this.lblAmigoToken.TabIndex=0;this.lblAmigoToken.Text="AmigoToken";////txtAmigoToken//this.txtAmigoToken.Location=newSystem.Drawing.Point(120,48);this.txtAmigoToken.Name="txtAmigoToken";this.txtAmigoToken.Size=newSystem.Drawing.Size(248,21);this.txtAmigoToken.TabIndex=1;this.txtAmigoToken.Text="";////lblFilename//this.lblFilename.Location=newSystem.Drawing.Point(40,96);this.lblFilename.Name="lblFilename";this.lblFilename.Size=newSystem.Drawing.Size(80,23);this.lblFilename.TabIndex=2;this.lblFilename.Text="Filename";////txtFilename//this.txtFilename.Location=newSystem.Drawing.Point(120,96);this.txtFilename.Name="txtFilename";this.txtFilename.Size=newSystem.Drawing.Size(248,21);this.txtFilename.TabIndex=3;this.txtFilename.Text="";////btnBrowse//this.btnBrowse.Location=newSystem.Drawing.Point(296,144);this.btnBrowse.Name="btnBrowse";this.btnBrowse.TabIndex=4;this.btnBrowse.Text="浏览";this.btnBrowse.Click+=newSystem.EventHandler(this.btnBrowse_Click);////txtFileData//this.txtFileData.Location=newSystem.Drawing.Point(120,144);this.txtFileData.Name="txtFileData";this.txtFileData.Size=newSystem.Drawing.Size(168,21);this.txtFileData.TabIndex=5;this.txtFileData.Text="";////lblFileData//this.lblFileData.Location=newSystem.Drawing.Point(40,144);this.lblFileData.Name="lblFileData";this.lbwww.hunanwang.netze=newSystem.Drawing.Size(72,23);this.lblFileData.TabIndex=6;this.lblFileData.Text="FileData";////btnUpload//this.btnUpload.Location=newSystem.Drawing.Point(48,184);this.btnUpload.Name="btnUpload";this.btnUpload.TabIndex=7;this.btnUpload.Text="Upload";this.btnUpload.Click+=newSystem.EventHandler(this.btnUpload_Click);////txtResponse//this.txtResponse.Location=newSystem.Drawing.Point(136,184);this.txtResponse.Multiline=true;this.txtResponse.Name="txtResponse";this.txtResponse.Size=newSystem.Drawing.Size(248,72);this.txtResponse.TabIndex=8;this.txtResponse.Text="";////frmUpload//this.AutoScaleBaseSize=newSystem.Drawing.Size(6,14);this.ClientSize=newSystem.Drawing.Size(400,269);this.Controls.Add(this.txtResponse);this.Controls.Add(this.btnUpload);this.Controls.Add(this.lblFileData);this.Controls.Add(this.txtFileData);this.Controls.Add(this.btnBrowse);this.Controls.Add(this.txtFilename);this.Controls.Add(this.lblFilename);this.Controls.Add(this.txtAmigoToken);this.Controls.Add(this.lblAmigoToken);this.Name="frmUpload";this.Text="frmUpload";this.ResumeLayout(false);}[STAThread]staticvoidMain(){Application.Run(newfrmUpload());}privatevoidbtnUpload_Click(objectsender,System.EventArgse){//非空检验if(txtAmigoToken.Text.Trim()==""||txtFilename.Text==""||txtFileData.Text.Trim()==""){MessageBox.Show("Pleasefilldata");return;}//所要上传的文件路径stringpath=txtFileData.Text.Trim();//检查文件是否存在if(!File.Exists(path)){MessageBox.Show("{0}doesnotexist!",path);return;}//读文件流FileStreamfs=newFileStream(path,FileMode.Open,FileAccess.Read,FileShare.Read);//这部分需要完善stringContentType="application/octet-stream";byte[]fileBytes=newbyte[fs.Length];fs.Read(fileBytes,0,Convert.ToInt32(fs.Length));//生成需要上传的二进制数组CreateBytescb=newCreateBytes();//所有表单数据ArrayListbytesArray=newArrayList();//普通表单bytesArray.Add(cb.CreateFieldData("FileName",txtFilename.Text));bytesArray.Add(cb.CreateFieldData("AmigoToken",txtAmigoToken.Text));//文件表单bytesArray.Add(cb.CreateFieldData("FileData",path,ContentType,fileBytes));//合成所有表单并生成二进制数组byte[]bytes=cb.JoinBytes(bytesArray);//返回的内容byte[]responseBytes;//上传到指定Urlbooluploaded=cb.UploadData("localhost/UploadData/UploadAvatar.aspx",bytes,outresponseBytes);//将返回的内容输出到文件using(FileStreamfile=newFileStream(@"c:esponse.text",FileMode.Create,FileAccess.Write,FileShare.Read)){file.Write(responseBytes,0,responseBytes.Length);}txtResponse.Text=System.Text.Encoding.UTF8.GetString(responseBytes);}privatevoidbtnBrowse_Click(objectsender,System.EventArgse){if(openFileDialog1.ShowDialog()==DialogResult.OK){txtFileData.Text=openFileDialog1.FileName;}}}}





















献花(0)
+1
(本文系白狐一梦首藏)