FineUploader 学习笔记

FineUploader既是开源的又是收费的,这个没搞懂。

先看效果:

.....

很清爽。

成功和失败很清楚。

从网上找到了这个插件的几个文件:

  1.  fineuploader-4.1.0.min.css
  2.  jquery.fineuploader-4.1.0.min.js
  3.  loading.gif
  4.  processing.gif

后2个是动画效果。

环境:

ASP.NET MVC 4

使用到的文件:

  1.  fineuploader-4.1.0.min.css
  2.  jquery.fineuploader-4.1.0.min.js
  3.  loading.gif
  4.  processing.gif
  5. jquery-1.8.3.min.js

View

@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Index</title>
    <script src="~/Scripts/jquery-1.8.3.min.js" type="text/javascript"></script>
    <script src="~/Scripts/FineUploader/jquery.fineuploader-4.1.0.min.js" type="text/javascript"></script>
    <link href="~/Scripts/FineUploader/fineuploader-4.1.0.min.css" rel="stylesheet" />

    <script type="text/javascript">
        $(document).ready(function () {
            var manualuploader = $('#manual-fine-uploader').fineUploader({
                request: {
                    endpoint: '/FineUploader/Index'
                },
                validation: {
                    //itemLimit: 3,
                    allowedExtensions: ['jpg', 'xlsx','xls', 'txt'],
                    sizeLimit: 10240000 // 10M
                },
                template: "qq-template-manual-noedit",
                autoUpload: false,

                callbacks:
                {
                    //文件开始提交(在浏览窗口中选择的每个文件都会触发该事件)
                    //id:文件在队列中的索引
                    //fileName:文件名称
                    onSubmit: function (id, fileName) {
                        //alert('this is  onSubmit Function,your selected is:' + fileName);
                        //只能上传规定的文件
                        var name = fileName.split('.')[0];//不带后缀名
                        switch (name) {
                            case 'Member':
                                break;
                            case 'Guestbook':
                                break;
                            default:
                                alert('请选择正确的文件上传!');
                                return false;
                                break;                              
                        }
                    },
                    //文件开始上传
                    onUpload: function (id, fileName) {
                        $('#file-' + id).addClass('alert-info')
                                        .html('<img src="../Scripts/FineUploader/loading.gif" alt="" /> alt="Initializing. Please hold."> ' +
                                        'Initializing ' +
                                        '' + fileName + '');
                        $('#progress').show();//显示进度动画
                    },
                    //文件上传失败
                    onError: function (event, id, name, errorReason, xhrOrXdr) {
                        //alert(qq.format("Error on file number {} - {}.  Reason: {}", id, name, errorReason));
                        //$('#message').append('上传文件失败:' + id, '<br/>' + name,+'<br/>'+ errorReason.response + '<br/>');
                    },
                    //文件上传结束
                    onComplete: function (id, fileName, responseJSON) {
                        //alert('This is onComplete function.');
                        //alert("complete name:"+responseJSON.name);//responseJSON就是controller传来的return Json
                        $('#message').append(responseJSON.msg);
                        $('#progress').hide();//隐藏进度动画   
                        //清除已上传队列
                        $('.qq-upload-list').hide();
                        //$('#manual-fine-uploader').fineUploader('reset');//(这个倒是清除了,但是返回的信息$('#message')里只能保留一条。)                       
                    }
                }
            });

            $('#triggerUpload').click(function () {
                manualuploader.fineUploader('uploadStoredFiles');
            });
        });
    </script>
    <script type="text/template" id="qq-template-manual-noedit">
        <div class="qq-uploader-selector qq-uploader">
            <div class="qq-upload-drop-area-selector qq-upload-drop-area" qq-hide-dropzone>
                <span>Drop files here to upload</span>
            </div>
            <div class="qq-upload-button-selector qq-upload-button">
                <div>选择文件</div>
            </div>
            <span class="qq-drop-processing-selector qq-drop-processing">
                <span>Processing dropped files...</span>
                <span class="qq-drop-processing-spinner-selector qq-drop-processing-spinner"></span>
            </span>
            <ul class="qq-upload-list-selector qq-upload-list">
                <li>
                    @*<div class="qq-progress-bar-container-selector">
                        <div class="qq-progress-bar-selector qq-progress-bar"></div>
                    </div>*@
                    <span class="qq-upload-spinner-selector qq-upload-spinner"></span>
                    <span class="qq-upload-file-selector qq-upload-file"></span>
                    <span class="qq-upload-size-selector qq-upload-size"></span>
                    <a class="qq-upload-cancel-selector qq-upload-cancel" href="#">取消</a>
                    <span class="qq-upload-status-text-selector qq-upload-status-text"></span>
                </li>
            </ul>
        </div>
    </script>
    <style type="text/css">
        .btn {
            background-color: #F87436;
            background-image: -moz-linear-gradient(center top, #F88D5A, #E65C47);
            color: #FFFFFF;
            text-shadow: none;
            width: 93px;
            text-align: center;
            cursor: pointer;
            padding: 6px;
        }

        #message {
            margin-top: 1px;
        }

            #message p {
                margin: 0px;
                padding: 9px;
                color: white;
            }
    </style>
</head>
<body>
    <!-- Fine Uploader DOM Element -->
    <div id="manual-fine-uploader"></div>
    <div id="triggerUpload" class="btn btn-primary" style="margin-top: 10px;">
        开始上传
    </div>
    <img id="progress" src="../Scripts/FineUploader/loading.gif" style="display: none;" />
    <div id="message"></div>
</body>
</html>

这里使用了js的模板<script type="text/template" id="qq-template-manual-noedit">

Controller

     public ActionResult Index()
        {
            return View();
        }
        [HttpPost]
        public ActionResult Index(HttpPostedFileBase qqfile)//qqfile是个固定的名称!
        {
            string msg = "";
            if (qqfile != null && qqfile.ContentLength > 0)
            {
                var fileNameWithExtension = Path.GetFileName(qqfile.FileName);
                var fileName = Path.GetFileNameWithoutExtension(qqfile.FileName);
                var path = Path.Combine(Server.MapPath("~/Uploads"), fileNameWithExtension);

                try
                {
                    if (System.IO.File.Exists(path))
                        System.IO.File.Delete(path);
                    qqfile.SaveAs(path);

                    //写入数据库
                    string tbName = "";
                    List<string> columnMapping = null;
                    ImportAndExport.MappingColumn(fileName, out tbName, out columnMapping);
                    ImportAndExport.ImportExcel(path, tbName, columnMapping);
                    System.IO.File.Delete(path);
                    msg = "<p style='background-color:#5DA30C'>写入成功: " + fileName + "</p>";
                }
                catch (Exception ex)
                {
                    System.IO.File.Delete(path);
                    msg = "<p style='background-color:#D60000'>写入失败: " + fileName + " [" + ex.Message + "]</p>";
                    return Json(new { success = false, error = ex.Message, msg = msg }, "text/html");
                }
            }
            //返回的json要有success字段:success = true 上传成功;success=false 上传失败。
            return Json(new { success = true, name = qqfile.FileName, msg = msg }, "text/html");
        }

帮助类:ImportAndExport

 

      ///<summary>导入Excel数据</summary>
        /// <param name="filePath">上传文件路径</param>
        /// <param name="dbTableName">数据库表名</param>
        /// <param name="columnMapping">数据表列映射</param>
        public static void ImportExcel(string filePath, string dbTableName, List<string> columnMapping = null)
        {
            //Create connection string to Excel work book
            string excelConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + filePath + ";Extended Properties='Excel 12.0;HDR=YES;IMEX=1';";
            //Create Connection to Excel work book
            using (OleDbConnection excelConnection = new OleDbConnection(excelConnectionString))
            {
                using (OleDbCommand excelCommand = new OleDbCommand("Select * from [Sheet1$]", excelConnection))
                {
                    excelConnection.Open();//打开连接
                    OleDbDataReader excelReader = excelCommand.ExecuteReader();
                    using (DataTable dt = new DataTable())
                    {
                        dt.Load(excelReader);//转为DataTable
                        //已映射的列会传递给批量写入模块,此处只添加不在Excel表格中出现的字段,如一些共有字段或特殊字段。
                        dt.Columns.Add(new DataColumn("CreatedBy", typeof(System.String)));
                        dt.Columns.Add(new DataColumn("CreatedOn", typeof(System.DateTime)));

                        //填充字段值        
                        foreach (DataRow dr in dt.Rows)
                        {
                            dr["CreatedBy"] = "Test";
                            dr["CreatedOn"] = DateTime.Now;
                        }

                        try
                        {//包含增加的字段映射传递给批量写入模块
                            BatchCopy0(dt, dbTableName, columnMapping);
                        }
                        catch (Exception)
                        {
                            excelCommand.Dispose();
                            excelConnection.Close();//关闭excel连接
                            throw;
                        }
                    }
                    excelConnection.Close();//关闭连接
                }
            }
        }
      ///<summary>字段映射</summary>
        ///<param name="fileName">文件名称</param>
        ///<param name="columnMapping">输出映射表</param>
        ///<param name="tbName">数据库表名</param>
        public static void MappingColumn(string fileName, out string tbName, out List<string> columnMapping)
        {
            tbName = "";
            columnMapping = new List<string>();

            if (fileName != null)
            {
                switch (fileName)
                {
                    case "Member":
                        tbName = "Member";
                        columnMapping.Add("姓名,Name");
                        columnMapping.Add("邮箱,Email");
                        columnMapping.Add("生日,Birthday");
                        columnMapping.Add("年龄,Age");
                        break;
                    case "Guestbook":
                        tbName = "Guestbooks";
                        columnMapping.Add("消息,Message");
                        break;
                    default:
                        break;
                }
                ////以下字段未在Excel表格中出现,需传给SqlBulkCopy。
                columnMapping.Add("CreatedBy,CreatedBy");
                columnMapping.Add("CreatedOn,CreatedOn");
            }
        }
        ///<summary>复制数据-不带事务的</summary>
        /// <param name="dt">源数据</param>
        /// <param name="tbName">目标数据表名称</param>
        ///<param name="columnMapping">完整的字段映射</param>
        public static void BatchCopy0(DataTable dt, string tbName, List<string> columnMapping)
        {
            using (SqlBulkCopy sbc = new SqlBulkCopy(sqlConnectionString, SqlBulkCopyOptions.KeepNulls))
            {
                sbc.DestinationTableName = tbName;

                if (columnMapping != null)
                {
                    foreach (var mapping in columnMapping)
                    {
                        var split = mapping.Split(new[] { ',' });
                        sbc.ColumnMappings.Add(split.First(), split.Last());
                    }
                }
                try
                {
                    sbc.WriteToServer(dt);
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }
        }    

 

Excel表格样式:

--End--

 

posted @ 2014-01-18 19:39  ibg  阅读(5195)  评论(2编辑  收藏  举报