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="width: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; width: 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/

 

posted @ 2012-11-05 16:39  志在必得Shaun  阅读(1421)  评论(0编辑  收藏  举报