文件上传是日常开发中经常遇到的,文件上传用的最多的当然是上传控件file了,一个form表单,其中有一点就是form表单的enctype属性设置为multipart/form-data,呵呵,这个在所有关于文件上传的文章中都有提示,长话短说,下面进入正题

对于控件的赋值和取值就不用说了,地球人都知道。但是其中有个上传控件,即类型为file的input,这个东东是个只读的,什么意思呢?简而言之就是可以读取他的value,但是不能直接给他赋值,没错,是不能直接给 他赋值,呵呵,当然有的人干脆说不能给他赋值(其实是可以通过其他办法给他赋值的)。关于这个给file控件赋值的文章,百度一下有网上一大把,但是有个 问题,百度出来的关于这个问题的解决办法基本上是同一个,无非就是说什么复制黏贴什么的,copy过来还不能用,不是一般的悲剧….

莫非这个问题只有这一种办法可以解决吗?当然不是,只是有些其他办法没被众人发现罢了

最近在一家国外网站发现一个不错的解决办法:原文链接,查看原文点击这里

文章是说 在WebBrowser组件的设置要上传的文件,简言之就是通过WebBrowser动态改变file控件的值,换句话说就是通过winform模拟webform上传文件,其中只要操作winform就行了,不需要点击webform的file控件选择上传文件等。

他的实现借助一个帮助类, FormToMultipartPostData.cs  还有一个主界面:Form1.cs,该窗口主要控件有一个webBrowser控件 webBrowser1,两个文本框,一个是用来输入处理文件路径的(TB_Path),就是file控件所在的php页面路径,另一个是用来输入要被上 传的文件的路径的(TB_UploadPath),两个button,button1对应TB_Path,就是将TB_Path的值赋给 webBrowser的url属性,BTN_Save对应TB_UploadPath,用来模拟点击file控件所在页面的上传按钮(submit),当 用户在点击BTN_Save时就把TB_UploadPath的值赋给file控件,从而实现不需选择文件就能上传指定文件。另外要注意的地方就是 webBrowser的两个方法,DocumentCompleted(对应的webBrowser1_DocumentCompleted)还有 Navigating(对应的webBrowser1_Navigating),前一个方法是在webBrowser控件加载完成后执行的方法,后一个方 法是在webBrowser导航前发生的事件。

当webBrowser没有预先绑定url时:程序执行的顺序一般情况下是先执行窗体加载事件(XXXLoad),然后执行DocumentCompleted,再执行Navigating,最后还要执行一次DocumentCompleted。

当webBrowser预先绑定了url时:程序执行的顺序一般情况下是先执行窗体加载事件(XXXLoad),然后执行Navigating,最后再执行DocumentCompleted。

以下是Form1.cs的代码,   在他的加载事件里写上如下代码,当然其实这些代码也可以省略,直接在设计视图时绑定就行了,关于在load方法绑定和在设计视图时绑定的区别我在前面已经提到过了(上面红色文字),这里就不罗嗦了….

private void Form1_Load(object sender, EventArgs e)
        {
                   this.webBrowser1.Navigate(“http://localhost/dev/test/index.php”);//加载处理页面(file控件所在的php页面)
        }

还有一个比较重要的方法,就是webBrowser的加载完成事件,就是通过这个事件实现为file控件赋值的,代码如下:
        private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
                   if (e.Url.ToString() != null && e.Url.ToString() != “”)
                   {
                            HtmlDocument doc = webBrowser1.Document;
                            for (int i = 0; i < doc.Forms.Count; i++)
                           {
                                 HtmlElement form = doc.Forms[i]; // must be declared inside the loop because there’s a closure
                                if (form.GetAttribute(“enctype”).ToLower() != “multipart/form-data”) { continue; }
                                form.AttachEventHandler(“onsubmit”, delegate(object o, EventArgs arg)
                               {
                                         FormToMultipartPostData postData = new FormToMultipartPostData(webBrowser1, form);
                                        if (this.TB_UploadPath.Text.ToString() != null)
                                       {
                                                   postData.SetFile(“file”,
this.TB_UploadPath.Text.ToString());//此处的file跟对应的php中的file控件的name属性相同
                                        }
                                       else
                                        {
                                                  
postData.SetFile(“file”,
@”C:\windows\win.ini”);//此处的file跟对应的php中的file控件的name属性相同
                                       }
                                      postData.Submit();//调用FormToMultipartPostData的Submit方法
                                });
                               form.SetAttribute(“hasBrowserHandler”,
“1″); // expose that we have a handler to JS    提示,我们有一个处理程序的JS
                      }
              }
     }
 
   还有一个webBrowser导航前发生事件,这个事件主要是载入处理页面的
   private void webBrowser1_Navigating(object sender, WebBrowserNavigatingEventArgs e)
   {
            string url = e.Url.ToString();//获取载入文档路径
             if (url.StartsWith(“submit:”))
            {
                       string formId = url.Substring(7);//截取字符串(去掉“submit:”)
                       HtmlElement form = webBrowser1.Document.GetElementById(formId);
                       if (form != null) form.RaiseEvent(“onsubmit”);
                      e.Cancel = true;
            }
    }

以下是file控件所在的页面的部分代码:test.php,脚本部分省略了,很简单的,无非就是单击提交数据
<form name=”form2″ id=”form2″ method=”post” enctype=”multipart/form-data”>
         <input type=”file” name=”file” />
         <input type=”text” name=”form2textfield” value=”it’s the second form” />
         <input type=’submit’ id=”btn_submit_tijiao” value=”提交” />
</form>

因为排版的原因,有些代码没有完整贴出来,比如那个帮这类,其实我自己也就一菜鸟,呵呵,我讲的可能有些地方不太正确,还望各位大侠多多提意见!

通过winForm控制webForm的上传控件file的值的更多相关文章

  1. html文件上传控件file自定义样式

    问题: HTML自带的file上传按钮因在各种浏览器里显示样式不一.不易自定义样式给我们带来很大的麻烦. 解决思路: 将input[type=file]控件隐藏,使用一个input[type=text ...

  2. 重置表单中的文件上传控件(file input)的方法

    方法一: 调用所在 form 表单的 reset 方法,这个方法的缺点是会把整个表单重置,需要存储表单的状态,再回填回去 方法二: 使用jQuery,代码为: $("#id").r ...

  3. 在WebBrowser中通过模拟键盘鼠标操控网页中的文件上传控件(转)

    引言 这两天沉迷了Google SketchUp,刚刚玩够,一时兴起,研究了一下WebBrowser. 我在<WebBrowser控件使用技巧分享>一文中曾谈到过“我现在可以通过WebBr ...

  4. 百度 flash html5自切换 多文件异步上传控件webuploader基本用法

    双核浏览器下在chrome内核中使用uploadify总有302问题,也不知道如何修复,之所以喜欢360浏览器是因为帮客户控制渲染内核: 若页面需默认用极速核,增加标签:<meta name=& ...

  5. 基于AngularJs的上传控件-angular-file-upload

    今天跟大家分享的是一个依赖于angular的上传控件. 前段时间做项目遇到一个需求是上传文件,大概需要实现的样式是这样子的,见下图: 需要同时上传两个文件.并且规定文件格式和文件大小.因为前端框架使用 ...

  6. [转]html5表单上传控件Files API

    表单上传控件:<input type="file" />(IE9及以下不支持下面这些功能,其它浏览器最新版本均已支持.) 1.允许上传文件数量 允许选择多个文件:< ...

  7. Extjs3 + swfUpload实现多文件上传控件

    要在ExrtJS框架实现选择多文件上传,FileUploadField已经无法满足需求,所以采用了 swfUpload上传控件,上传窗口如下: 多选文件进行上传(其实是每个文件异步上传),可以中途停止 ...

  8. 前端上传控件plupload总结

    plupload是一个单图和多图上传控件: 属性和方法介绍,参考以下博客: https://www.cnblogs.com/2050/p/3913184.html 这里直接贴出JS代码,细到爆的注释, ...

  9. 对百度WebUploader开源上传控件的二次封装,精简前端代码(两句代码搞定上传)

    前言 首先声明一下,我这个是对WebUploader开源上传控件的二次封装,底层还是WebUploader实现的,只是为了更简洁的使用他而已. 下面先介绍一下WebUploader 简介: WebUp ...

随机推荐

  1. android中使用哪种方式解析XML比較好

    SAX是一个用于处理XML事件驱动的"推"模型. 长处是一种解析速度快而且占用内存少的xml解析器,它须要哪些数据再载入和解析哪些内容. 缺点是它不会记录标签的关系.而要让你的应用 ...

  2. 实战ffs函数

    这个函数是返回整形的最低位1的位置 自己写是这个样子的: /* Find the first bit set in I. */ int lx_ffs(int i) { int index = 0, r ...

  3. Android播放音频的两种方式

    一种使用MediaPlayer,使用这种方式通常是播放比较长的音频,如游戏中的背景音乐. 代码如下: private MediaPlayer mPlayer = null; mPlayer = Med ...

  4. 如何解决DE0-Nano的EPCS16 无法下载的问题:NO EPCS LAYOUT DATA --- LOOKING FOR SECTION [EPCS-XXXXXX]

    在用NIOS的flashprogram对EPCSx进行烧录程序时,出现了No EPCS layout data --- looking for section [EPCS-XXXXXX]的错误,在网上 ...

  5. javascsript 去除数组重复数据

    function uniqid(arr){ var newArr = []; var c; for(var i = 0 ;i <= arr.length ;i++){ c = false; fo ...

  6. 初识数据字典【weber出品必属精品】

    数据字典结构 有两部分组成: 1. 基表:以$结尾的系统表,在创建数据库的时候,oracle自动创建的表 2. 用户可以访问的视图 数据字典的种类 DICTIONARY:简称DICT,所有的数据字典, ...

  7. WCF入门教程系列四

    一.概述 配置也是WCF编程中的主要组成部分.在 以往的.net应用程序中,我们会把DBConn和一些动态加载类及变量写在配置文件里.但WCF有所不同.他指定向客户端公开的服务,包括服务的地址. 服务 ...

  8. OpenGL ES 2.0 雾

    在场景中使用雾不但可以提高真实感,特定的情况下还能优化性能.具体是指当物体离摄像机足够远时,雾就足够浓,此时只能看到雾而看不到物体,也就不必对物体着色进行详细计算,这样可以大大提高渲染效率. 雾有很多 ...

  9. OpenGL ES 2.0 限定符

    限定符 说明 作用 attribute 一般用于各个顶点各不相同的量,如顶点位置.颜色等 属性限定符,修饰的变量用来接收渲染管线传递进顶点着色器的当前顶点的各种属性值. 只能用来修饰符点数标量,浮点数 ...

  10. [QT]QT概述

    QT概述 基于C++的GUI开发框架,跨平台.Qt 是一个用于桌面系统和嵌入式开发的跨平台应用程序框架. QT是挪威TROLLTECH公司开发的跨平台C++工具,在UNIX下非常出名:他的宗旨是“一次 ...