问题描述:因为某些原因导致flash不好用,而且只能在浏览器IE5的情况下怎么实现文件上传
首先IE5下不支持formData文件上传,addEventListener的用法,以及多文件上传multiple="multiple"的属性。
下面是解决方案:
首先在form上加上enctype="multipart/form-data"这个属性,如果不加的话,后台根本不会获取到文件
其次单文件上传的话可以直接使用
在form表单提交的时候就把上传的文件一起提交
如果想实现多文件上传,我采取的是js实现动态多文件上传
首先有一个文件上传 上传之后文件名会放到<span></span>
标签里面
代码:
<td colspan="3">
<div id="eee">
<span>选择文件:</span>
<div class="file-select" id="file_div1">
<input type="file" onchange="fileChange()" />
<span class="brower"></span>
<input type="button" onclick="deleteDiv()" style="display: none;" value="删除" />
</div>
</div>
</td>
然后实现
代码:
<script language="javascript">
var number = 1;
function fileChange(){
var preDiv = document.getElementById("file_div" + number);
var nextDiv = preDiv.cloneNode(true);
number = number + 1;
// 添加新的div
nextDiv.setAttribute("id", "file_div" + number)
document.getElementById("eee").appendChild(nextDiv);
// 对已选完文件的div进行处理
var preFile = preDiv.children[0],
preSpan = preDiv.children[1],
preButton = preDiv.children[2];
preFile.name = "files"+number;
preFile.id = "files"+number;
preFile.style["display"] = "none";
preSpan.className = "";
preSpan.innerHTML = preFile.value.substring(preFile.value.lastIndexOf('\\')+1);
preButton.style["display"] = "inline-block";
}
// 删除方法
function deleteDiv(event) {
var ev = event || window.event;
var target = ev.target || ev.srcElement;
document.getElementById("eee").removeChild(target.parentNode);
}
</script>
还有另外一种动态增加<input/>
标签的,也是可以实现,但是由于不太好看,就没有采用
<input type="file" id="file" name="files"/>
<span id = "upload"></span>
js实现部分
document.getElementById("files").attachEvent("onchange",function () {
var i = 1;
var file = "files";
var attach = file + i ;
if(i>0){
if(createInputFile(attach))
i=i+1;
}
});
function createInputFile(num){
var aElement=document.createElement("input");
aElement.name=num;
aElement.id=num;
aElement.type="file";
if(document.getElementById("upload").appendChild(aElement) == null){
return false;
}else{
return true;}
}
function getFileName(controlID,fileBox) {
if (fileBox.value){
var path = fileBox.value;
var fileName = path.substring(path.lastIndexOf('\\')+1,path.lastIndexOf('.'));
document.getElementById(controlID).value = fileName;
}
}
注意点
IE5 支持 attachEvent的使用但是它要加上on
就是这样使用
另外关于后台参数接收问题
因为我写的时候是一步一步进行封装的后台,也就是后台在接收文件name的值的时候如果name值有一样的就会报错,所以我是采用每个文件的name都不同
例如
和
采取了给它赋name值的操作,这样使得每个的name值都不一样
一般来说,几个文件的name值一样,后台用数组接收应该也可以(我没有尝试)
另外,采取第一种方式进行多文件上传的话
如果有文件必选的逻辑:
if(document.getElementById("file_div1").innerHTML.value==""){
alert('请选文件');
return false;
}
因为标签的id和name值没有写,之所以没有写是因为写了之后往后台传值的话会有null的情况,就比如说你上传了两个文件,但是后台会接收三个,有一个为null
结果图:
这是我采用了第一种多文件上传的方式
这是第二种方式
PS:别的好像就没有什么了,欢迎指点!!!