用javascript从access数据库提取文件 一、原理 1、用javascript在客户端通过ADODB.Connection建立与access数据库的连接,通过ADODB.Recordset打开数据库。 2、在客户端利用Scripting.FileSystemObject组件检测要解包的文件夹是否存在,如果不存在,就创建文件夹。 3、Adodb.Stream组件在客户端将数据流生成文件。 二、实现 CODE:[Copy to clipboard]数据库: 表名:FL FileName:文件名 FileData:二进制文件内容 FilePath:文件路径 以下是我写的客户端解包程序代码,大家把下面的代码保存为hta格式的文件即可! 注:高版本的IE浏览器内不可以直接调用Adodb.Stream组件。 CODE:[Copy to clipboard]<HTML> <HEAD> <TITLE> IISVS_文件解包工具 </TITLE> <meta name="description" content="作者:翟振凯,小琦"> <SCRIPT LANGUAGE="JavaScript"> <!-- function get_files(filename,filePath) {//核心代码 var o=new Date(); var fso = new ActiveXObject("Scripting.FileSystemObject"); //生成查询和更新用的sql语句。 var sqlSelCnt = "SELECT * FROM [FL] "; //建立连接,并生成相关字符串。 var con = new ActiveXObject("ADODB.Connection"); con.Provider = "Microsoft.Jet.OLEDB.4.0"; con.ConnectionString = "Data Source=" + filename; con.open; var rs = new ActiveXObject("ADODB.Recordset"); rs.open(sqlSelCnt,con); while (!rs.eof) { var path2 = filePath + rs.Fields("FilePath") ; var path3 = path2 + rs.Fields("FileName"); var fsize = rs.Fields("Filedata").ActualSize; Create_dir(filePath,rs.Fields("FilePath"));//创建文件夹函数 if (fsize!=0){ //如果文件大小不为0,也就是说,非文件夹 if (fso.FileExists(path3)==false){//检测文件是否存在,如不存在就创建文件 var adodbStream = new ActiveXObject("ADODB.Stream"); adodbStream.Type =1//以二进制模式打开 adodbStream.Open(); adodbStream.write(rs.Fields("Filedata").GetChunk(fsize)); adodbStream.SaveToFile(path3,2); adodbStream.Close(); adodbStream=null; } } rs.moveNext; } rs.close(); rs = null; con.close(); con = null; alert("解压完成!用时"+(new Date()-o)/1000+"毫秒"); } function Create_dir(filePath,dir){//创建文件夹函数 tt.value=dir dir=tt.value var fso = new ActiveXObject("Scripting.FileSystemObject"); var dir2="" sTrArr2=dir.split("\\") for (var k=0;k<sTrArr2.length; k++){ if(sTrArr2[k]!=undefined){ if (fso.FolderExists((filePath+dir2))==false) fso.CreateFolder((filePath+dir2));//检测文件夹是否存在 dir2+=sTrArr2[k]+"\\" } } } function iv(inp,act)//取到数据库所在路径 { iDot = inp.lastIndexOf('\\'); if(iDot>-1) dir = inp.substr(iDot+1).toLowerCase(); show1.innerHTML =inp show2.innerHTML =inp.substring(0, iDot+1)//取到数据库所在路径 if (act==1) get_files(inp,inp.substring(0, iDot+1)); } //--> </SCRIPT> </HEAD> <BODY> <input name=tt id=tt value="" type="hidden"> 解包文件地址:<div id="show1"></div><br> 解包文件所在文件夹:<div id="show2"></div> 选择要解包的文件:<input type="file" id=ph onpropertychange="iv(this.value,0)"/> <input type="submit" value="解包" name="B1" onclick="iv(ph.value,1)"></BODY> </HTML> 相信大家看完,一定会感觉此方法技术含量不大,但我感觉此方法的确很有实用价值! 有些时候,点子要比技术更加重要。用最简单的技术,实现最有价值的功能,是我不懈的追求,也是我到目前还没有放弃ASP编程的一个原因。 |