asp.net 上传控件 模仿邮箱 模式

来源:岁月联盟 编辑:exp 时间:2011-10-20

这个插件也不算是原创吧,毕竟基础代码是从网上下载来的,首先谢谢开始做这个控件的人。在这个基础上,我添加了一些功能,完善了下。

说明:

这个上传控件的前台是基于html 和javascript生成和处理的

后台是 c# .

效果图

 

 /

 通过点击 添加附件,就可以选择相应的文件并添加。现在的功能是指允许图片上传

代码分析:


//var path="UserControls/"//删除按钮路径 
var inputCount = 1; //控件个数,实际上传数少一个,  
var Allupfiled = 0; //总共上传 
var Endupfiled = 0; //已上传 
var allowExtension = "" 
var ua = navigator.userAgent.toLowerCase(); //浏览器信息 
var info = { 
    ie: /msie/.test(ua) && !/opera/.test(ua),        //匹配IE浏览器     
    op: /opera/.test(ua),     //匹配Opera浏览器     
    sa: /version.*safari/.test(ua),     //匹配Safari浏览器     
    ch: /chrome/.test(ua),     //匹配Chrome浏览器     
    ff: /gecko/.test(ua) && !/webkit/.test(ua)     //匹配Firefox浏览器 
}; 
window.onload = SetClick; //加载完成,添加一个控件 
function SetClick() { 
    //if(inputCount>=10) 
    //{ 
    //alert("附件个数不能超过10个!"); 
    //return; 
    //} 
    var container = document.getElementById("fileUpArea"); 
    var input1 = document.createElement("input"); 
    input1.type = "file"; 
 
    //input1.name="file"+inputCount; 
    input1.name = "filesupload"; 
    input1.id = "file" + inputCount; 
    input1.className = "fileinput"; 
 
 
    input1.onchange = function (event) { 
        if (this.value) { 
            var k = this.value.lastIndexOf("//"); 
            var str = this.value.substring(k + 1); 
            //判断上传文件类型 
            if (!CheckFileExtension(str)) return false; 
            var divs = document.getElementById("filetxt").getElementsByTagName("div"); 
            var check = false; 
 
            for (var i = 0; i < divs.length; i++) { 
                if (divs[i].innerHTML.indexOf(str) != -1) { 
                    check = true; 
                    break; 
                } 
            } 
            if (!check) { 
                Allupfiled++; 
                SetIframeInput(this, inputCount, str); 
            } 
            else { 
                alert("不允许添加同名附件!请重命名!"); 
                return; 
            } 
        } 
    } 
    container.appendChild(input1); 
    inputCount++; 
    //input1.click(); 

//这里可以动态去设定文件类型 
function CheckFileExtension(str) { 
    var extension = str.lastIndexOf("."); 
    if (str.indexOf(".gif", extension) == -1 && str.indexOf(".jpg", extension) == -1 && str.indexOf(".png", extension) == -1) { 
        alert("请选择gif或jpg或png的图象文件"); 
        return false; 
    } 

function CheckFileNames(str) { 
    var divs = document.getElementById("filetxt").getElementsByTagName("div"); 
    var check = false; 
 
    for (var i = 0; i < divs.length; i++) { 
        if (/"+str"+/i.test(divs[i].innerHTML)) { 
            check = true; 
            break; 
        } 
    } 
 

 
var WriteCookie = function (name, value, duration, path, domain, secure) { 
    if (name == null || name == '') { 
        throw ("name"); 
    } 
 
        var cookie = name + "=" + escape(value) 
    + (duration ? 
        "; expires=" + (new Date(new Date().getTime() + (duration * 3600000))).toUTCString() : 
        "") 
    + "; path=" + (path && path != '' ? 
        path : 
        "/") 
    + (domain && domain != '' ? 
        "; domain=" + domain : 
        "") 
    + (secure ? 
        "; secure" : 
        ""); 
 
        document.cookie = cookie; 
}; 
var ReadCookie = function (name) { 
    if (!name || name == '') { 
        throw ("name"); 
    } 
 
    if (document.cookie.length > 0) { 
        ix = document.cookie.indexOf(name + "="); 
        if (ix > -1) { 
            start = ix + name.length + 1; 
            end = document.cookie.indexOf(";", start); 
            if (end == -1) { 
                end = document.cookie.length; 
            } 
            return unescape(document.cookie.substring(start, end)); 
        } 
    } 
    return null; 

function SetIframeInput(input, num, str)//选取值后的file控件,第几个,选取的文件名称 

    var body = document.body; //页面body 
    var name = input.id; //fileName 
    var contxt = document.createElement("div"); //显示附件名称用的div 
    var filetxtDiv = document.getElementById("filetxt"); //显示用的div(contxt)的上级div; 
    var iframename = "iframe" + name; //框架iframe的名称 
    var iframe; //框架 
    var form = document.createElement('form'); //创建表单 
    var statediv = document.createElement("span"); //状态div 
    var stopdiv = document.createElement("span"); //停止按钮 
    var jxupdiv; //上传按钮 
    var imgs = document.createElement('img'); //删除按钮 
    var upedfilename; //上传后文件名称 
    //var filedNames=document.getElementById("filedName");//显示上传后所有附件名称,后台取值用 
    var filedNames = getfiledName(); 
    if (Endupfiled == 0) { 
        filedNames.value = ""; 
    } 
 
    contxt.id = input.id + "text"; //显示用的div(contxt)的ID 
    contxt.innerHTML = str + "  "; //contxt的innerHTML(显示内容) 
    contxt.className = ""; 
    filetxtDiv.appendChild(contxt); //添加一个显示附件内容的div 
 
    imgs.src = path + "images/f2.gif"; 
    imgs.onclick = Dispose; //删除事件 
    contxt.appendChild(imgs); //添加删除按钮 
 
    statediv.id = "state" + num; 
    statediv.className = "spanstate"; 
    statediv.innerHTML = "准备上传"; 
    contxt.appendChild(statediv); //添加状态div 
 
    //创建iframe 
    iframe = document.createElement(info.ie ? "<iframe name=/"" + iframename + "/">" : "iframe"); 
    if (info.ie) { 
        document.createElement("<iframe name=/"" + iframename + "/">"); 
    } 
    else { 
        document.createElement("iframe"); 
    } 
    iframe.name = iframename; 
    iframe.style.display = "none"; 
    //插入body 
    body.insertBefore(iframe, body.childNodes[0]); 
 
    //设置form 
    form.name = "form" + name; //表单名称 
    form.target = iframename; 
    form.method = "post"; 
    form.encoding = "multipart/form-data"; 
    form.action = path + "Fileup.ashx?type=add"; 
    //form.action="UserControls/CallBack.aspx"; 
    body.insertBefore(form, body.childNodes[0]); 
 
    //添加控件进form 
    form.appendChild(input); 
 
    SetClick(); //重新添加一个upfile控件 
    statediv.innerHTML = "正在上传"; 
 
    //添加停止按钮 
    stopdiv.id = "stopdiv" + num; 
    stopdiv.innerHTML = "停止"; 
    stopdiv.style.cursor = "hand"; 
    contxt.appendChild(stopdiv); 
    stopdiv.onclick = function ()//停止事件 
    { 
        iframe.src = path + "StopUpLoad.ashx"; //无任何处理代码 
        window.frames[iframename].location.reload(); //重新刷新iframe终止上传,在 iframe onload事件中处理 
        //iframe.location.reload(); 
    } 
    //定义iframe 的onload事件 
    if (info.ie)//IE 需要注册onload事件 
    { 
        iframe.attachEvent("onload", CallBack); 
    } 
    else { 
        iframe.onload = CallBack; 
    } 
 
    //提交 -------------------------------------------------- 
    form.submit(); 
    //提交完毕----------------------------------------------- 
    function CallBack()//iframe加载完成,返回结果处理 
    { 
        try { 
            var value = iframe.contentWindow.document.body.innerHTML; 
            upedfilename = value.substring(value.indexOf("@returnstart@") + 13, value.indexOf("@returnend@")); 
            if (upedfilename.length > 3)//正常上传,返回上传后文件名 
            { 
                //alert(upedfilename);  
                finished(); 
            } 
            else//停止上传,从StopUpLoad.ashx页面返回空值,也可能是返回错误001,000 
            { 
                if (upedfilename == "002") { 
                    alert("上传文件类型不正确"); 
                } 
                var parent = document.getElementById("filetxt"); 
                parent.removeChild(statediv.parentNode); 
                /*statediv.innerHTML="等待上传";
                statediv.style.color="#008080";
                continueUpLoad();//上传按钮*/ 
            } 
        } 
        catch (msg) { 
            statediv.innerHTML = "上传失败"; 
            statediv.style.color = "#808080"; 
            continueUpLoad(); //上传按钮 
        } 
    } 
    function continueUpLoad()//上传按钮 
    { 
        stopdiv.style.visibility = "hidden"; 
        jxupdiv = document.createElement("span"); //上传按钮 
        jxupdiv.id = "jxupdiv" + num; 
        jxupdiv.innerHTML = "上传"; 
        jxupdiv.style.cursor = "hand"; 
        contxt.appendChild(jxupdiv); //添加上传按钮 
        jxupdiv.onclick = function ()//重新上传 
        { 
            contxt.removeChild(jxupdiv); 
            statediv.innerHTML = "正在上传"; 
            statediv.style.color = "#0099FF"; 
            stopdiv.style.visibility = "visible"; 
            form.submit(); //重新提交          
        } 
    } 
    function Dispose()//删除事件 
    { 
        //alert("ddd"); 
        form.action = path + "Fileup.ashx?type=del"; 
        form.submit(); 
 
        filetxtDiv.removeChild(contxt); 
        body.removeChild(form); 
        body.removeChild(iframe); 
        Allupfiled--; //总上传数减一 
        if (upedfilename) { 
            if (upedfilename.length > 3) { 
                Endupfiled--; 
                if (upedfilename == filedNames.value) { 
                    filedNames.value = ""; 
                } 
                else if (filedNames.value.indexOf(upedfilename) == 0) { 
                    filedNames.value = filedNames.value.replace(upedfilename + ",", ""); 
                } else { 
                    filedNames.value = filedNames.value.replace("," + upedfilename, ""); 
                } 
            } 
        } 
    } 
    function finished()//上传完毕 
    { 
        statediv.style.color = "#ff0000"; 
        statediv.innerHTML = "上传成功"; 
        contxt.removeChild(stopdiv); 
        if (filedNames.value == "") { 
            filedNames.value = upedfilename; 
        } 
        else { 
            filedNames.value += "," + upedfilename; 
        } 
 
        Endupfiled++; //已上传数加一 
    } 

function checkFileState() { 
    if (Endupfiled != Allupfiled) { 
        alert("还有文件未上传成功!"); 
        return false; 
    } 
    return true; 

后台:


<%@ WebHandler Language="C#" Class="Fileup" Debug="true"%> 
 
using System; 
using System.Web; 
using System.IO; 
 
 
public class Fileup : IHttpHandler { 
     
    public void ProcessRequest (HttpContext context) { 
 
        string type = context.Request.QueryString["type"]; 
        switch(type) 
        { 
            case "add": 
                AddFile(context); 
                break; 
            case "del": 
                DelFile(context); 
                break; 
            default: 
                break; 
        } 
         
    } 
 
    protected void DelFile(HttpContext context) 
    { 
        string filename = context.Request.Cookies.Get("filecookie").Value; 
        string strFilePath = context.Server.MapPath("upfile/" + filename); 
        if (File.Exists(strFilePath)) 
        { 
            File.Delete(strFilePath); 
        } 
        context.Request.Cookies.Remove("filecookie"); 
         
    } 
    protected bool CheckFile(string fileExtension) 
    { 
        string[] allowExtension = { ".jpg", ".gif",".png" }; 
        bool fileOk = false; 
        for (int i = 0; i < allowExtension.Length; i++)   
        {   
            if (fileExtension == allowExtension[i])   
            {   
                fileOk = true;   
                break;   
            }   
 
        } 
        return fileOk; 
    } 
    protected void AddFile(HttpContext context) 
    { 
 
        string str1 = ""; 
        string str2 = ""; 
        string rvalue = ""; 
 
        try 
        { 
            HttpFileCollection fileList = context.Request.Files; 
            //HttpFileCollection fileList = HttpContext.Current.Request.Files; 
            for (int i = 0; i < fileList.Count; i++) 
            { 
                HttpPostedFile hPostedFile = fileList[i]; 
                string filename = ""; 
                string filepath = ""; 
                if (hPostedFile.ContentLength > 0 && hPostedFile.FileName.Length > 0) 
                { 
 
                    //float zldx = hPostedFile.ContentLength / 1024; 
                    filename = hPostedFile.FileName; 
                     
                    int k = filename.LastIndexOf("."); 
                    int j = filename.LastIndexOf("//"); 
                    string type = filename.Substring(k); 
                    //filename = filename.Substring(j + 1, k - j - 1); 
                    filename = filename.Substring(j + 1); 
                    DateTime datetime1 = System.DateTime.Now; 
                    type = type.ToLower(); 
                    if (!CheckFile(type)) 
                    { 
                        rvalue = "002"; 
                        break; 
                    } 
                    filepath = datetime1.ToString("yyyyMMddHHmmss") + "." + type; 
                    HttpCookie filecookie = new HttpCookie("filecookie"); 
                    filecookie.Value = filepath; 
                    context.Response.Cookies.Add(filecookie); 
 
                    hPostedFile.SaveAs(System.Web.HttpContext.Current.Server.MapPath("upfile//" + filepath)); 
                    if (str1 == "") 
                        str1 = filepath; 
                    else 
                        str1 += "," + filepath; 
                    if (str2 == "") 
                    { 
                        str2 += filename; 
                    } 
                    else 
                        str2 += "," + filename; 
                } 
            } 
            if (str1.Length > 0) 
            { 
                //context.Response.Write(str1 + "&" + str2); 
                rvalue = str1; 
            } 
            else 
            { 
                if (rvalue.Length == 0) 
                { 
                    rvalue = "000"; 
                } 
            } 
        } 
        catch (Exception e) 
        { 
            rvalue = "001"; 
        } 
 
        context.Response.Expires = -1; 
        context.Response.Clear(); 
        context.Response.ContentEncoding = System.Text.Encoding.GetEncoding("GB2312"); 
        context.Response.ContentType = "text/plain"; 
        //context.Response.Write("<script type='text/javascript'>parent.finish('" + rvalue + "');</script>"); 
        context.Response.Write("@returnstart@" + rvalue + "@returnend@"); 
        context.Response.End();     
    } 
  
    public bool IsReusable { 
        get { 
            return false; 
        } 
    } 
 

原理: 通过生成<input type="file">  控件 和 form表单,然后提交到后台,实现文件的上传。同样,删除也是。

具体代码下载:http://www.2cto.com/uploadfile/2011/1020/20111020021550306.zip
 

作者:wyqlxy