`
huangjun_mail
  • 浏览: 115655 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

浏览器upload文件到Web服务器

    博客分类:
  • Java
阅读更多

     前段时间写了一个IC卡读写COM组件,这个组件可以把数据以文件的方式读写到IC卡里;但是由于有时服务器端是WebServer,需要把文件download/upload到WebServer.
     在这个过程中由于读完IC卡文件后,需要立即upload到服务器,所以不能用标准的<input type="file">html标签去传送文件,后来用了公司另外一个Team的组件,可以实现多线程,分片上传,但是由于此组件封装太死,在我们Team的开发平台下运行,界面展现有问题;百般无奈中,只能自己寻找方法:

     1.通过XMLHTTP传输

   <script type="text/javascript">
    function doFileUpLoad()
    {
     var strFilePath = "c:\\0000000005.txt";
     var xmlstream = new ActiveXObject("ADODB.Stream");
   xmlstream.Mode = 3; //read write
   xmlstream.Open();
   xmlstream.Type = 1; // adTypeBinary
   xmlstream.LoadFromFile(strFilePath);
     var xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
     xmlhttp.Open("POST","http://127.0.0.1:8088/SomePost",false);
   xmlhttp.setRequestHeader("Content-Length",xmlstream.Size); //set the length of the content
     xmlhttp.send(xmlstream.Read(xmlstream.Size)); //Send the stream
     //alert(xmlhttp.responseText);
     var text = BytesToBstr(xmlhttp.responseBody,"GBK");
     document.getElementsByName("data")[0].value = text;//xmlhttp.responseText;
    }


    function  BytesToBstr(body,Cset)
    {
   var objstream = new ActiveXObject("ADODB.Stream");
   objstream.Type = 1;
   objstream.Mode = 3 ;
   objstream.Open();
   objstream.Write=body;
   objstream.Position=0;
   objstream.Type=2;
   objstream.Charset=Cset;
   var result = objstream.ReadText();  
   objstream.Close();
   return result;
  }
 </script>

  传输过去的文件内容,放在“空行”数据下面(POST发送的HTTP协议数据,最后一个HTTP Header下面是空行,空行下面是Header以外的数据),可以通过服务器端去处理文件内容,至于文件名称,可以直接写在自定义HTTP Header里,或写入文件内容最前面(当然文件大小、文件内容Hash值等都可以写入进去);最后由服务器端程序(如Servlet)把数据流写入文件。

    2.直接把文件内容存在标签value中。
       function doReadFileToBuff(filename)
        {
                 var ForReading = 1, ForWriting = 2, ForAppending = 8;
                 // The following line contains constants for the OpenTextFile
                 // format argument, which is not used in the code below.
                var TristateUseDefault = -2, TristateTrue = -1, TristateFalse = 0;
                var fso = new ActiveXObject("Scripting.FileSystemObject");
               // Open the file for output.
               var f = fso.OpenTextFile(filename, ForReading, true,TristateUseDefault);
               var value = "";
               if (!f.AtEndOfStream)
                  value = f.ReadAll();
               f.Close();
              document.getElementById("form:filecontent").value = value;
        }

       这种方式其实最简单,不用专门去解析HTTP协议,不过FileSystemObject Activex只能处理文本文件,对于处理二进制文件,会丢掉一些文件内容;如果处理二进制文件,可以使用第一种方式。

具体FileSystemObject 可以参考MSDN:http://msdn.microsoft.com/en-us/library/z9ty6h50(VS.85).aspx

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics