Asp.Net模拟表单提交数据和上传文件的实现代码
如果你需要跨域上传内容到另外一个域名并且需要获取返回值,使用Asp.Net的作为代理是最好的办法,要是客户端直接提交到iframe中,由于跨域是无法用javascript获取到iframe中返回的内容的。此时需要在自己的网站做一个动态页作为代理,将表单提交到动态页,动态页负责将表单的内容使用WebClient或HttpWebRequest将表单数据再上传到远程服务器,由于在服务器端进行操作,就不存在跨域问题了。
WebClient上传只包含键值对的文本信息示例代码:
stringuriString="http://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="http://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 毛票票:https://www.nhooo.com -----------------------------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;
publicbyte[]JoinBytes(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.lblFileData.Size=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;
//上传到指定Url
booluploaded=cb.UploadData("http://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;
}
}
}
}