前段时间写了一个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