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

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

说明:

这个上传控件的前台是基于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表单,然后提交到后台,实现文件的上传。同样,删除也是。

具体代码下载

你可能感兴趣的:(asp.net 上传控件 模仿邮箱 模式)