zoukankan      html  css  js  c++  java
  • 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();
  • 相关阅读:
    160422、Highcharts后台获取数据
    160421、MyBatis批量插入数据
    微信小程序wx:for循环
    【小程序】获取到的e.target与e.currentTarget区别
    微信小程序如何像vue一样在动态绑定类名
    发布 Vant
    ZanUI-WeApp -- 一个颜值高、好用、易扩展的微信小程序 UI 库
    微信小程序 使用wxParse解析html
    精通移动端布局
    axios interceptors 拦截 , 页面跳转, token 验证 Vue+axios实现登陆拦截,axios封装(报错,鉴权,跳转,拦截,提示)
  • 原文地址:https://www.cnblogs.com/lxshanye/p/3752827.html
Copyright © 2011-2022 走看看