JS技术

Javascript仿163网盘无刷新文件上传系统_Javascript教程(6)

字号+ 作者:H5之家 来源:H5之家 2015-09-26 11:00 我要评论( )

Code $(idBtnupload).onclick = function(){ //显示文件列表 var arrRows = []; Each(fu.Files, function(o){ arrRows.push([o.value, nbsp;]); }); AddList(arrRows); fu.Folder.style.display = none; $(idProces

Code
$("idBtnupload").onclick = function(){
    //显示文件列表
    var arrRows = [];
    Each(fu.Files, function(o){ arrRows.push([o.value, " "]); });
    AddList(arrRows);
   
    fu.Folder.style.display = "none";
    $("idProcess").style.display = "";
    $("idMsg").innerHTML = "正在添加文件到您的网盘中,请稍候……<br />有可能因为网络问题,出现程序长时间无响应,请点击“<a href='?'><font color='red'>取消</font></a>”重新上传文件";
   
    fu.Form.submit();
}
说到表单提交要注意一个问题,就是表单是不能嵌套的,最好是把表单放到服务器表单之外,没有办法才使用服务器表单作为提交表单(由于程序会修改提交表单的属性,所以尽量不要这样使用)。

这样文件列表就完成了,有兴趣的话也可以自己封装一下这个功能。


【file样式】
到此,程序的功能都已经实现了,但在163网盘中还有一个特别的地方,就是file控件的样式。
如果有用过163网盘上传文件,就知道那个file控件就像一个按钮,但功能确实是一个file控件。
但当自己尝试修改file控件的样式时,发现单单设置file控件的样式并不能实现想要的效果。
于是我想了另一个办法,用一个button来模拟,结果发现也不行,用js根本操作不了file控件,应该是考虑到安全问题吧。
最后是参考了163网盘和muxrwc模拟126附件添加的效果,总结了这个方法:
1.指定用一个容器(例如程序中的idFile)。
容器最好指定高和宽,并且overflow为hidden,不是块级元素的最好设display为block(为了高和宽的正确呈现);
2.在容器里放一个file控件,并设置样式,使能触发弹出选择文件框的部分覆盖整个容器,并设置成全透明。
容器指定准确的高和宽就是为了能通过file控件中不多的能设置的样式来覆盖整个容器;
3.现在已经把容器模拟成file控件了,可以直接设置容器的样式来模拟设置file控件的样式了。

在程序中主要用file控件的margin-left和font-size来实现覆盖整个容器:

Code
a.files input {
    margin-left:-350px;
    font-size:30px;
    cursorointer;
    filter:alpha(opacity=0);
    opacity:0;
}
至于容器,我使用了有伪类hover的a元素(虽然CSS2中hover可以应用于任何对象,但ie6不支持)。
这里用了一个常用的小技巧,就是用一张图片作为背景通过在hover时修改background-position来实现两张图片的效果:

Code
a.files {
    width:90px;
    height:30px;
    overflow:hidden;
    display:block;
    border:1px solid #BEBEBE;
    background:url(img/fu_btn.gif) left top no-repeat;
    text-decoration:none;
}
a.files:hover {
    background-color:#FFFFEE;
    background-position:0 -30px;
}
在点击这个a时后会出现一个虚线框,在这里显然不太美观,可以把outline设为none来去掉,可是ie又不支持,在网上找到一个方法ie可以把hideFocus设为true来隐藏聚焦(即不显示这个虚线框,hideFocus可以在js或html中设置,也可以通过expression放到css中:

Code
a.files, a.files input {
    outline:none;/*ff* /
    hide-focus:expression(this.hideFocus=true);/*ie* /
}

这样完全模拟了163网盘的效果了。


【后台】

前台基本完成了,就到后台啦。后台的功能很简单,就是处理传递过来的文件数据。
这里像js + .Net 图片切割系统那样使用ashx文件处理IHttpHandler发送过来的数据。
程序很简单,就直接贴代码了:

Code
int iTotal = context.Request.Files.Count;

if (iTotal == 0)
{
    _msg = "没有数据";
}
else
{
    int iCount = 0;

    for (int i = 0; i < iTotal; i++)
    {
        HttpPostedFile file = context.Request.Files[i];

        if (file.ContentLength > 0 || !string.IsNullOrEmpty(file.FileName))
        {
            //保存文件
            file.SaveAs(System.Web.HttpContext.Current.Server.MapPath("./file/" + Path.GetFileName(file.FileName)));

            //这里可以根据实际设置其他限制
            if (++iCount > UploadFileLimit)
            {
                _msg = "超过上传限制:" + UploadFileLimit;
                break;
            }
        }
    }
}
这里只检测了有无文件和文件数限制,其他检测如文件大小等可以自己扩展,应该不难。
处理完数据之后就通知客户端:

context.Response.Write("<script>window.parent.Finish('" + _msg + "');</script>");
这个在上面iframe的内容中已经说明了。


使用说明

基本使用很简单,实例化一个file对象,其中参数分别是form对象,文件空间对象:

new FileUpload("uploadForm", "idFile")
这样就实现了一个简单的无刷新上传文件表单。

还可以使用这几个属性:
Form//表单
Folder//文件控件存放空间
Files//文件集合

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • JavaScript入门教程(二)_javascript教程教程

    JavaScript入门教程(二)_javascript教程教程

    2015-10-10 14:25

  • JavaScript入门教程(五)_javascript教程教程

    JavaScript入门教程(五)_javascript教程教程

    2015-10-10 14:21

  • JavaScript入门教程(四)_javascript教程教程

    JavaScript入门教程(四)_javascript教程教程

    2015-10-10 14:19

  • JavaScript入门教程(三)_javascript教程教程

    JavaScript入门教程(三)_javascript教程教程

    2015-10-10 14:17

网友点评