这两天因为工作的需要,需要做一个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  客户端

 
 FileStream fs = new FileStream(“需上传文文件路径”, FileMode.Open, FileAccess.Read);

             byte[] byteFile = new byte[fs.Length];

             fs.Read(byteFile, , Convert.ToInt32(fs.Length));

             fs.Close();

             string postData = "param1=pwd&FileName=file1.xml&UploadFile=" + HttpUtility.UrlEncode(Convert.ToBase64String(byteFile));

             var webclient = new WebClient();

             webclient.Headers.Add("Content-Type", "application/x-www-form-urlencoded");

             byte[] byteArray = Encoding.UTF8.GetBytes(postData);

             byte[] buffer = webclient.UploadData(“远程ashx URL”, "POST", byteArray);

             var msg = Encoding.UTF8.GetString(buffer);

3   服务端

 string param1= context.Request["param1"].ToString();
FileStream fs = new FileStream(“需要保存文件的路径”, FileMode.Create, FileAccess.Write);
fs.Write(Convert.FromBase64String(context.Request["UploadFile"].ToString()), , Convert.FromBase64String(context.Request["UploadFile"].ToString()).Length);
fs.Flush();
fs.Close();

winform下通过webclient使用非流方式上传(post)数据和文件的更多相关文章

  1. 使用WebClient Post方式模拟上传文件和数据

    假如某网站有个表单,例如(url: http://localhost/login.aspx):帐号  密码 我们需要在程序中提交数据到这个表单,对于这种表单,我们可以使用 WebClient.Uplo ...

  2. Windows下GIT安装与使用(上传远程端)

    Windows下GIT安装与使用(上传远程服务器) 1.  登陆http://msysgit.github.io/并下载Git 2.  打开下载的exe文件,一路默认(路径可以去修改).有可能电脑需要 ...

  3. Linux下自动备份MySQL数据库并上传到远程FTP服务器

    Linux下自动备份MySQL数据库并上传到远程FTP服务器且删除指定日期前的备份Shell脚本 说明:  1.备份MySQL数据库存放目录/var/lib/mysql下面的xshelldata数据库 ...

  4. Linux下vsftpd的安装,Java上传文件实现。

    首先我们需要查看是否已经安装vsftpd,输入命令 :vsftpd  -v.如果出现以下信息,那么就说明已经安装vsftpd 如果没有安装,那么输入命令   : yum  install vsftpd ...

  5. 使用Windows下的git工具往github上传代码 踩坑记录

    使用Windows下的git工具往github上传代码 踩坑记录 背景 由于以前接触的项目都是通过svn进行版本控制,现在公司项目使用git,加上自己平时有一个练手小项目,趁着周末试着把项目上传到自己 ...

  6. 理解流方式上传和form表单上传

    流方式上传: $post_input = 'php://input'; $save_path = dirname( __FILE__ ); $postdata = file_get_contents( ...

  7. widow下svn上传项目时的文件可执行权限问题

    还是项目上发现的问题,要上传Android的源码项目.这里客户端是windows的机器, 测试后发现俩个问题. 1. 文件后缀是.so的文件默认上传不了.    2. 文件后缀是.sh的文件,上传后, ...

  8. windows下命令行终端使用rz上传文件参数详解

    rz命令: (X) = option applies to XMODEM only (Y) = option applies to YMODEM only (Z) = option applies t ...

  9. 使用cmd命令行方式登录ftp上传下载数据

    部分用户在使用ftp工具登录空间上传下载过程中经常会遇到各种问题,如主动模式,被动模式,以及其他导致无法登陆ftp .上传数据.下载数据的问题,这时候不妨使用一下命令行方式.命令行下可以避免很多由于f ...

随机推荐

  1. java基础篇---正则表达式

    正则表达式在许多语言,例如Perl.PHP.Python.JavaScript和JScript,都支持用正则表达式处理文本,一些文本编辑器用正则表达式实现高级“搜索-替换”功能. 正则表达式是一种可以 ...

  2. CentOS6.5 安装Python 的依赖包

    1.CentOS6.5 安装Python 的依赖包 yum groupinstall "Development tools"yum install zlib-devel bzip2 ...

  3. Docker之宿主机ssh至docker容器

    下载docker: https://www.docker.com/products/overview 下载镜像: docker pull centos 查看镜像:docker images 创建镜像对 ...

  4. python -修改文件中某一行

    写代码写错了顺序,所以想办法把x,y坐标调换回来 def change_ptsxy(fileName): fp = open(fileName) i = file_data = "" ...

  5. java IO【转】

    Java 流在处理上分为字符流和字节流.字符流处理的单元为 2 个字节的 Unicode 字符,分别操作字符.字符数组或字符串,而字节流处理单元为 1 个字节,操作字节和字节数组. Java 内用 U ...

  6. 代码备忘, TODO宏实现

    代码备忘, TODO宏实现 我们平时在开发过程中, 往往并非憋足气一股脑敲完所有代码.每一个模块, 每一个函数的实现总有个先后顺序. 又或者哪个部分须要做调整, 改动- 所以, 我们须要有一个东西, ...

  7. 【javascript】浮点数运算问题分析及解决方法

    问题: 在用 js 进行小数四则运算时发现了一个重大问题,比如:0.7 * 0.8 = 0.5599999999999999 分析: 在 js 中只有一种数字类型 Number,而且在 js 中所有的 ...

  8. Dapper:安装Dapper时报错

    今天在使用VS 2013安装Dapper的时候报错,具体报错信息如下: 经过网上查找错误原因,发现是安装的Dapper版本过高,.Net Framework版本不支持该版本的Dapper. 解决方案: ...

  9. MFC——CDC

    CDC类定义的是设备上下文对象的类,有称设备环境对象类. Windows使用与设备无关的图形设备环境(DC:Device Context)进行显示. 说到CDC类就不能不提一下GdiObject——图 ...

  10. sqlldr 学习总结1

    1.建表语法(采用scott中的emp表) create table emp(  empno    number(4) not null,  ename    varchar2(10),  job   ...