winform下通过webclient使用非流方式上传(post)数据和文件

这两天因为工作的需要,需要做一个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();
原文地址:https://www.cnblogs.com/lxshanye/p/3752827.html