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


    这两天因为工作的需要,需要做一个winform上传数据到服务器端的程序。当时第一个想法是通过webservice的方式来实现,后来觉得麻烦,想偷懒就没有用这样的方式,http的post方式变成了第一选择。因为以前用的都是httpwebrequest之类的东西进行post提交,winform下面还真的是第一次,不过很快就在网上找到了webclient这个类,接下来开始实现功能,话说webclient用起来还真的很简单,一个头信息的声明,然后是URL,最后是post的数据,就完事了。正在高兴的时候发现了一个问题。之前post的全是字符串之类的信息,可是接下来要同时post数据和文件,这个该怎么办呢,如何书写post中的数据呢?google一下找到了类似这样的帖http://www.iwms.net/n1765c12.aspx,这样帖子很多,而且大多内容都完全一样,互相转来转去的。但是大致中心思想就是让我们用流拼接的方式进行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();
     

    现在想想可以省去那么多的代码真的是一件很不错的事情,向上面我们搜到的帖子内容说拜拜吧。

  • 相关阅读:
    WPF中用户控件对比自定义控件(UserControl VS CustomControl) upcode
    WinCE7开发过程 upcode
    App/Shell启动过程 upcode
    WinCE启动过程 upcode
    ASP.NET 4.0验证请求 A potentially dangerous Request.Form value was detected from the client
    HTML5 开发工具推荐
    用.NET部署卸载window服务
    C#去除HTML标签方法
    正在中止线程 的问题解决
    【转载】纯CSS画的基本图形(矩形、圆形、三角形、多边形、爱心、八卦等)
  • 原文地址:https://www.cnblogs.com/zhwl/p/2396052.html
Copyright © 2020-2023  润新知