最近要做个功能,要在浏览器其端上传客户本地文件夹,查找很久资料,勉强实现,做个记录,本人新手,大神无视我吧。
我们知道B/S模式下,浏览器是不允许js上传文件的。如果可以,恶意代码会扫描电脑把敏感文件都上传了,所以上传文件只能用<input type="file"/> 而file控件不能通过脚本控制其value,因此我们不能使用file控件来自动上传本地文件。这就很尴尬了,然后我找到ie的ActiveX,差强人意。
一、首先要用到ie的activeX插件,这个比较蛋疼,要在ie 安全设置里设置运行activeX插件,并将该网站添加到 受信任站点中(可先去掉下方 对该区域所有站点要求服务器验证的勾,再添加自己的网址,再打上勾)。
二、完成我们就能在js中是使用activeX对象了,能上代码就不bb:
1 页面
<input type="text" id="path" name="path" >
<a οnclick="browse()">选择文件夹</a>
<a οnclick="subfile()">上传</a>
2 js代码
function browse() {
var path = BrowseFolder();
$("#path").val(path);
}
//用于打开浏览对话框选择路径
function BrowseFolder() {
try {
var Message = "请选择文件夹"; //选择框提示信息
var Shell = new ActiveXObject("Shell.Application");
var Folder = Shell.BrowseForFolder(0, Message, 0x0040, 0x11);//起始目录为我的电脑
//var Folder = Shell.BrowseForFolder(0,Message,0); //起始目录为桌面
if (Folder != null) {
Folder = Folder.items(); // 返回 FolderItems 对象
Folder = Folder.item(); // 返回 Folderitem 对象
Folder = Folder.Path; // 返回路径
if (Folder.charAt(Folder.length - 1) != "\\") {
Folder = Folder + "\\";
}
return Folder;
} else {
Folder = "";
return Folder;
}
} catch (e) {
alert(e.message);
}
}
//点击上传按钮
function subfile() {
//文件最外层路径
var allpath = $("#path").val();
if (!allpath) {
alert("请选择文件夹");
return false;
}
var paarr=[];
var parr = FindAllFiles(allpath, paarr);
//上传至后台
var fileDic = [];
for (var i = 0; i < parr.length; i++) {
var data = {};
var ForReading = 1;
//声明操作文件的对象
fso = new ActiveXObject("Scripting.FileSystemObject");
ts = fso.OpenTextFile(parr[i], ForReading);
//读取前2000个字符,这里我只取文件夹里的txt文件
s = ts.read(2000);
data.path = parr[i].Path;
data.ftxt = s;
fileDic.push(data);//txt文件路径:文件内容
}
var json = JSON.stringify(fileDic);
//var json = $.toJSON(fileDic);
$.ajax({
type: "POST",
url: //上传到后台的路径
data: { 要上传的数据},
dataType: "json",
success: function (d) {
},
error: function (d) {
}
});
}
function FindAllFiles(filePath, fparr) {
try {
var fso = new ActiveXObject("Scripting.FileSystemObject");
var f = fso.GetFolder(filePath);
} catch (e) {
alert("请设置ie浏览器:设置-internet选项-安全-自定义:启用ActiveX!");
return false;
}
var fc = new Enumerator(f.files);
//var fparr = [];//存放文件名
var fdparr = [];//存放文件夹名
for (; !fc.atEnd() ; fc.moveNext()) {
fparr.push(fc.item());
}
fk = new Enumerator(f.SubFolders);
for (; !fk.atEnd() ; fk.moveNext()) {
fdparr.push(fk.item());
}
//递归遍历查找文件夹下的所有子文件
for (var i = 0; i < fdparr.length; i++) {
FindAllFiles(fdparr[i], fparr);
}
return fparr;
}