这两天因为工作的需要,需要做一个winform上传数据到服务器端的程序。当时第一个想法是通过webservice的方式来实现,后来觉得麻 烦,想偷懒就没有用这样的方式,http的post方式变成了第一选择。因为以前用的都是httpwebrequest之类的东西进行post提 交,winform下面还真的是第一次,不过很快就在网上找到了webclient这个类,接下来开始实现功能,话说webclient用起来还真的很简 单,一个头信息的声明,然后是URL,最后是post的数据,就完事了。正在高兴的时候发现了一个问题。之前post的全是字符串之类的信息,可是接下来 要同时post数据和文件,这个该怎么办呢,如何书写post中的数据呢?google一下找到了类似这样的帖http://www.2cto.com/kf/201203/123217.html, 这样帖子很多,而且大多内容都完全一样,互相转来转去的。但是大致中心思想就是让我们用流拼接的方式进行post,可是说实话我看了半天没有看懂。又懒得 尝试和模仿。难道就真的没有像之前一样采用a=XXX1&b=XXXX2这样的形式进行文件和数据post的方法吗?
OK,现在问题出来了,结论是肯定的,其实之所以不能像之前那样post数据,主要的原因是无法把文件流和字符串进行拼接,那么只需要将文件流转变为字符串就OK了。顺着这个思路继续的思考。
如果你做过Flash的开发那么现在马上应该有相应的结论了,就是base64。碰巧我也是因为之前的一个Flash项目用到过Base64,所以很快的就想到了这个方法。微软的c#给我们提供了一个非常好的方法Convert.ToBase64String,可以非常容易的将byte[]转为string类型,既然有了这个方法,剩下的就是还是像以前一样拼接提交的字符串就行了。
数据到了服务器端显示request,之后用自带的Convert.FromBase64String进行转化成byte[]。
终于到了这里偷懒的同时post数据和文件到服务器上功能就实现了。
上代码
读取文件存为byte[]
FileStream fs = new FileStream("文件名", FileMode.Open, FileAccess.Read);
byte[] byteFile = new byte[fs.Length];
fs.Read(byteFile, 0, Convert.ToInt32(fs.Length));
fs.Close();
拼接提交的字符串
postData = "id=xxx&name=xxx&file=" + HttpUtility.UrlEncode(Convert.ToBase64String(byteFile));
服务器端接收信息,并保存为文件
string pic = Request["file"].ToString();
FileStream fs = new FileStream("保存的文件完整路径", FileMode.Create, FileAccess.Write);
fs.Write(Convert.FromBase64String(pic), 0, Convert.FromBase64String(pic).Length);
fs.Flush();
fs.Close();
demo:
1 思路:
WebClient.UploadFile()方法可以上传文件;UploadData()方法可以上传数据参数;如何合二为一既上传文件又上传参数呢?可将文件也当做参数,调用UploadData()方法
2 客户端
|
1 FileStream fs = new FileStream(“需上传文文件路径”, FileMode.Open, FileAccess.Read); 2 3 byte[] byteFile = new byte[fs.Length]; 4 5 fs.Read(byteFile, 0, Convert.ToInt32(fs.Length)); 6 7 fs.Close(); 8 9 string postData = "param1=pwd&FileName=file1.xml&UploadFile=" + HttpUtility.UrlEncode(Convert.ToBase64String(byteFile)); 10 11 var webclient = new WebClient(); 12 13 webclient.Headers.Add("Content-Type", "application/x-www-form-urlencoded"); 14 15 byte[] byteArray = Encoding.UTF8.GetBytes(postData); 16 17 byte[] buffer = webclient.UploadData(“远程ashx URL”, "POST", byteArray); 18 19 var msg = Encoding.UTF8.GetString(buffer);
3 服务端
1 string param1= context.Request["param1"].ToString(); 2 FileStream fs = new FileStream(“需要保存文件的路径”, FileMode.Create, FileAccess.Write); 3 fs.Write(Convert.FromBase64String(context.Request["UploadFile"].ToString()), 0, Convert.FromBase64String(context.Request["UploadFile"].ToString()).Length); 4 fs.Flush(); 5 fs.Close();