• uploadify多文件上传的例子


          最近用uploadify做了一个多文件上传的功能,所有文件上传完成后,显示文件列表,图片显示缩略图,其他类型显示文件类型图标,word2003文件可使用dsoframer.ocx实现在线编辑。还可以在列表中编辑文件备注并更新。同时还可以验证指定类型的文件是否超过大小/个数限制;还有只能上传一个word文档,后上传的word文档选择后提示是否替换之前的,根据用户选择决定是否上传和是否替换之前的数据。

         这里只给出基本的demo,因为其他功能我都是硬编码的,且和项目的相关性比较高,不是通用的。但是我会说明一下设计思路。

    前台部分代码:

    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head id="Head1" runat="server">
        <title>uploadifyDemo</title>
        <link rel="stylesheet" type="text/css" href="uploadify/uploadify.css" />
    </head>
    <body>
        <form id="form1" runat="server">
        
            <%--此处ID必须以file_upload开头 FileUpload.js中是按file_upload开头来查找的--%>
            <input id="file_upload_test" name="file_upload_test" type="file" />
            
            <%--此处ID必须以queue开头且queue_之后的命名和上面的input的ID的file_upload后的值一致 
            FileUpload.js中是按queue开头来查找的--%>
            <div id="queue_test" class="queue" style="display: none;"></div>
            
        </form>
    
        <script type="text/javascript" src="uploadify/jquery.min.js"></script>
    
        <script type="text/javascript" src="uploadify/jquery.tmpl.min.js"></script>
    
        <script type="text/javascript" src="uploadify/jquery.uploadify.js"></script>
    
        <script type="text/javascript" src="uploadify/FileUpload.js"></script>
    
        <script type="text/javascript">
        
            var agrs_test=[];
            
            agrs_test['donePage']="FileUploadTestDone.ashx";
            
            //agrs_test['buttonImage']="images/addfile.gif";
            
            agrs_test['btnHeight']="22";
            
            agrs_test['btnWidth']="90";
            
            agrs_test['buttonText']="选择文件";
            
            agrs_test['fileType']="*.gif; *.jpg; *.png";
            
            agrs_test['multi']=true;
            
            agrs_test['auto']=true;
            
            var fileUpload=new FileUpload('queue_test','file_upload_test',agrs_test);
            
        </script>
    
    </body>
    </html>

     FileUpload.js内容:

    //文件上传对象构造
    FileUpload=function(listId,fileTxtId,agrs)
    {
    var jqueryIdSel='#'+fileTxtId;
    
    $(function()
    {
        $(jqueryIdSel).uploadify(
        {
           'queueID':listId,//queueID
           'swf'               :agrs['swf']===undefined            ?   'uploadify/uploadify.swf'       :agrs['swf'],//flash文件路劲
            'uploader'          :(agrs['donePage']===undefined      ?   'FileUploadTestDone.ashx'       :agrs['donePage']) + '?var=' + new Date().toString(),//接收文件的页面
            'buttonImage'       :agrs['buttonImage']===undefined    ?   null:agrs['buttonImage'],//选择文件按钮的图片
            'buttonText'        :agrs['buttonText']===undefined     ?   'SELECT FILES'                  :agrs['buttonText'],//选择文件按钮的文字
            'height'            :agrs['btnHeight']===undefined      ?   '15'                            :agrs['btnHeight'],//选择文件按钮的高度
            'width'             :agrs['btnWidth']===undefined       ?   '60'                            : agrs['btnWidth'],//选择文件按钮的宽度
            'auto'              :false,
            'fileTypeExts'      :agrs['fileType']===undefined       ?   '*.gif; *.jpg; *.png;*.doc'     :agrs['fileType'],//文件类型
            'multi'             :agrs['multi']===undefined          ?   true                            :agrs['multi'],//是否多选
            'uploadLimit'       :agrs['uploadLimit']===undefined    ?   999                             :parseInt(agrs['uploadLimit'],10),//上传文件数限制
            'onQueueComplete'   :function(queueData) 
                                {
                                    $("#"+listId).hide();
                                },
            'onDialogClose'     :function(queueData)
                                {
                                    if(queueData.filesSelected>0)
                                    {
                                        if(agrs['auto'])//自定义的自动上传
                                             {
                                           startUpload();
                                        }
                                    }
                                }
            });
        });
    };
    
    //上传
    function startUpload()
    {
        //所有的控件都上传
        $("div[id^='file_upload'].uploadify").each(function()
        {
            var id = $(this).attr("id");
            var queueObj=$("#"+id.replace("file_upload","queue"));
    
            uploadifyUpload(this,queueObj);
        });
    }
    
    function uploadifyUpload(uploadifyElmObj,queueObj)
    {
        if(uploadifyElmObj!=null)
        {
            if(queueObj.find("div.uploadify-queue-item a[href*='uploadify']").size()>0)
            {
                queueObj.css("filter","Alpha(Opacity=90)");
                queueObj.css("position","absolute");
                queueObj.css("top",$(uploadifyElmObj).attr("top"));
                queueObj.css("left",10);
                queueObj.css("width","700px");
                queueObj.show();
    
                $(uploadifyElmObj).uploadify('upload','*');
            }
        }
    }
    
    //取消
    function cancelUpload()
    {
        $("div[id^='file_upload'].uploadify").uploadify('cancel');//所有的控件都取消上传
    }

    接收文件的后台代码:

    <%@ WebHandler Language="C#" Class="Handler" %>
    
    using System;
    using System.IO;
    using System.Web;
    using System.Web.Configuration;
    using System.Data.SqlClient;
    using System.Web.SessionState;
    
    public class Handler : IHttpHandler, IReadOnlySessionState, IRequiresSessionState
    {
    
        public void ProcessRequest(HttpContext context)
        {
    
            string uploadPath = HttpContext.Current.Server.MapPath("UploadedFiles") + "\\";
            string oldName = "";
            string resultStr = "";
    
            try
            {
                HttpPostedFile file = context.Request.Files["Filedata"];
    
                if (file != null)
                {
                    if (!Directory.Exists(uploadPath))
                    {
                        Directory.CreateDirectory(uploadPath);
                    }
    
                    oldName = file.FileName;
    
                    string fileType = Path.GetExtension(file.FileName).ToLower();
    
                    string newName = Guid.NewGuid().ToString() + fileType;
    
                    uploadPath += newName;
    
                    switch (fileType)
                    {
                        case ".doc": fileType = "WORD文档(.doc)"; break;
                        case ".txt": fileType = "文本文档(.txt)"; break;
                        case ".pdf": fileType = "PDF文档(.pdf)"; break;
                        case ".gif":
                        case ".jpg":
                        case ".bmp":
                        case ".png": fileType = "图片文档(.gif/.jpg/.bmp/.png)"; break;
                    }
    
                    double uploadFileSize = file.ContentLength / 1024;
                    double limitedFileSize = 0;
                    if (fileType == "WORD文档(.doc)")
                    {
                        limitedFileSize = double.Parse(WebConfigurationManager.AppSettings["docFile_MaxRequestLength"]);
                        if (uploadFileSize > limitedFileSize)
                        {
                            context.Session["uploadifyErrorMess"] += oldName + "超过Word文件大小限制(" + Math.Round(limitedFileSize / 1024, 2) + @"MB)\n";
                            resultStr = "0";
                        }
                    }
                    else if (fileType == "图片文档(.gif/.jpg/.bmp/.png)")
                    {
                        limitedFileSize = double.Parse(WebConfigurationManager.AppSettings["imgFile_MaxRequestLength"]);
                        if (uploadFileSize > limitedFileSize)
                        {
                            context.Session["uploadifyErrorMess"] += oldName + "超过图片文件大小限制(" + Math.Round(limitedFileSize / 1024, 2) + @"MB)\n";
                            resultStr = "0";
                        }
                    }
    
                    //using (SqlConnection conn = new SqlConnection(DefaultDBConnection))
                    //{
                    //conn.Open();
    
                    //省去数据库操作的代码...
    
                    if (resultStr != "0")
                    {
                        file.SaveAs(uploadPath); //存文件
                    }
    
                    ////生成缩略图
                    //if (fileType.IndexOf(".gif/.jpg/.bmp/.png") > -1)
                    //{
                    //    MakeThumbnail(uploadPath, uploadPath.Replace("\\UploadedFiles\\", "\\UploadedFiles\\Thumbnails\\"), 72, 72);
                    //}
    
                    //}
    
                    resultStr = "1";
                }
                else
                {
                    resultStr = "0";
                }
            }
            catch (Exception ex)
            {
                //logger.Error("保存附件异常!");
                //logger.Error("异常描述:\t" + ex.Message);
                //logger.Error("异常方法:\t" + ex.TargetSite);
                //logger.Error("异常堆栈:\t" + ex.StackTrace);
    
                if (ex.Message == "超过了最大请求长度。")
                {
                    context.Session["uploadifyErrorMess"] += oldName +
                        "超过服务器端上传文件大小限制(" + Math.Round(double.Parse(WebConfigurationManager.AppSettings["maxRequestLength"]) / 1024, 2) + @"MB)\n"; ;
                }
                resultStr = "0";
            }
    
            context.Response.ContentType = "text/plain";
            context.Response.Write(resultStr);
        }
    
        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    
    }

    显示上传文件列表的思路就是在所有文件上传完成后,单独发一个AJAX请求查询关联的文件信息即可(前提是保存了这些数据到数据库,且知道查询该数据的ID)。另外显示列表的时候可以带出Session["uploadifyErrorMess"]中的信息。至于文件个数的限制就是利用这个列表的HTML来查找已经上传的文件的信息了。

    判断是否所有文件已经上传完成的方法是修改jquery.uploadify.js中case SWFUpload.FILE_STATUS.COMPLETE:下的方法:

    setTimeout(function() { 
        if ($('#' + file.id)) {
            swfuploadify.queueData.queueSize   -= file.size;
            swfuploadify.queueData.queueLength -= 1;
            delete swfuploadify.queueData.files[file.id]
            
            var closeTag=$('#' + file.id).find("a[href*='uploadify']");
            closeTag.remove();
            
            $('#' + file.id).hide()//隐藏已上传文件提示div
            
            /*$('#' + file.id).fadeOut(500, function() {
                $(this).remove();
            });*/
        }
    }, 0);    
    //}, settings.removeTimeout * 1000);

    那么判断是否全部上传完成,只需在onUploadComplete事件中添加如下代码:

    if($("div[id^='queue'].queue").find("a[href*='uploadify']").size()==0)
    {
        //完成
    }

    另外顺带说明一下,改dsoframer标题栏的一个小方法:

    <style type="text/css">
        .Cover{
        position: absolute;
        top: 106px;
        left:5px;
        background-color: #FFFFFF;
        z-index: 10000;
        width:810px
        text-align:center;
        vertical-align:middle;
        color:#FFFFFF;
        font-size:9pt;
        }
    </style>
    
    <div id="WordEdit">
        <object id="MyOffice" name = "MyOffice" style="100%;height:630px"
                classid="clsid:00460182-9E5E-11D5-B7C8-B8269041DD57" codebase="dsoframer.ocx#2,2,0,8"></object>
    </div>
    
    <div class="Cover" id="Cover_DIV" style="padding-top:3px;padding-left:4px;">
        Word编辑
        <iframe style="position: absolute; z-index: -1;  100%; height:21px; top: 0; left: 0;" src="footer.html"
                frameborder="0" scrolling="no" border="0" marginwidth="0" marginheight="0"/>
    </div>
    
    <script>
            $("#Cover_DIV").width($("body").width()-6);
    </script>

    打包下载:uploadifyDemo.rar

    参考资料:http://www.uploadify.com/documentation/

  • 相关阅读:
    微软免费人工智能课程
    如何定义,创建,启动一个线程
    什么是进程,什么是线程?
    Hashtable 数据遍历的几种方式
    action中result没有值
    <global-results>怎么用
    普通请求和ajax请求的区别
    result默认返回action中的所有数据,要想返回指定的数据怎么做呢
    ajax技术的应用?
    什么是国际化
  • 原文地址:https://www.cnblogs.com/xuezhizhang/p/2755417.html
Copyright © 2020-2023  润新知