浏览器upload文件到Web服务器
???? 前段时间写了一个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