1. 程式人生 > >基於MVC4+EasyUI的Web開發框架形成之旅--附件上傳元件uploadify的使用

基於MVC4+EasyUI的Web開發框架形成之旅--附件上傳元件uploadify的使用

大概一年前,我還在用Asp.NET開發一些行業管理系統的時候,就曾經使用這個元件作為檔案的上傳操作,在隨筆《Web開發中的檔案上傳元件uploadify的使用》中可以看到,Asp.NET中如何使用這個元件進行檔案上傳的,當時上傳檔案的處理主要也是使用ashx一般處理程式來進行處理的。本文主要介紹我的Web開發框架中,在MVC4的環境中如何整合這個非常棒的檔案上傳元件的。

1、上傳元件uploadify的說明及指令碼引用

Uploadify 是 JQuery 一個著名的上傳外掛,利用 Flash 技術,Uploadify 越過瀏覽器的限制,控制了整個上傳的處理過程,實現了客戶端無重新整理的檔案上傳,這樣就實現了在客戶端的上傳進度控制,所以,你首先要確定瀏覽器中已經安裝了 Adobe 的 Flash 外掛。
Uploadify 當前有兩個版本,基於 Flash 是免費的,還有基於 HTML5 的收費版,我們使用免費版,當前版本為v3.2.1。

這個元件需要Jquery庫的支援,一般情況下,需要新增Jquery的js庫,如下所示

<script type="text/javascript" src="~/Scripts/jquery-2.0.3.min.js"></script>

不過由於我的Web開發框架是基於EasyUI的,一般在網頁的開始就會引用相關的類庫,已經包含了Jquery的類庫了,如下所示。

    @*新增Jquery,EasyUI和easyUI的語言包的JS檔案*@
    <script type="text/javascript" src="~/Content/JqueryEasyUI/jquery.min.js"
></script> <script type="text/javascript" src="~/Content/JqueryEasyUI/jquery.easyui.min.js"></script> <script type="text/javascript" src="~/Content/JqueryEasyUI/locale/easyui-lang-zh_CN.js"></script>

所以我們只需要新增Javascript類庫(jquery.uploadify.js),另外加上他的樣式檔案(uploadify.css)即可:

    @*新增對uploadify控制元件的支援*@
    @*<script type="text/javascript" src="~/Scripts/jquery-2.0.3.min.js"></script>*@
    <script type="text/javascript" src="~/Content/JQueryTools/uploadify/jquery.uploadify.js"></script>
    <link href="~/Content/JQueryTools/uploadify/uploadify.css" rel="stylesheet" type="text/css" />

2、上傳元件uploadify在Web介面的使用

首先我們需要在HTML程式碼中放置兩個控制元件,一個是用來上傳的控制元件,一個是用來顯示已上傳列表的控制元件,還有就是新增上傳和取消上傳的按鈕操作,如下所示。

 <tr>
                        <th>
                            <label for="Attachment_GUID">附件上傳:</label>
                        </th>
                        <td>                            
                            <div>
                                <input class="easyui-validatebox" type="hidden" id="Attachment_GUID" name="Attachment_GUID" />
                                <input id="file_upload" name="file_upload" type="file" multiple="multiple">
                                <a href="javascript:void(0)" class="easyui-linkbutton" id="btnUpload" data-options="plain:true,iconCls:'icon-save'"
                                    onclick="javascript: $('#file_upload').uploadify('upload', '*')">上傳</a>
                                <a href="javascript:void(0)" class="easyui-linkbutton" id="btnCancelUpload" data-options="plain:true,iconCls:'icon-cancel'"
                                    onclick="javascript: $('#file_upload').uploadify('cancel', '*')">取消</a>

                                <div id="fileQueue" class="fileQueue"></div>
                                <div id="div_files"></div>
                                <br />
                            </div>
                        </td>
                    </tr>

介面效果初始化如下所示:

當然,下一步我們需要新增相應的檔案上傳初始化的操作指令碼程式碼,如下所示。

    <script type="text/javascript">
        $(function () {
            //新增介面的附件管理
            $('#file_upload').uploadify({
                'swf': '/Content/JQueryTools/uploadify/uploadify.swf',  //FLash檔案路徑
                'buttonText': '瀏  覽',                                 //按鈕文字
                'uploader': '/FileUpload/Upload',                       //處理檔案上傳Action
                'queueID': 'fileQueue',                        //佇列的ID
                'queueSizeLimit': 10,                          //佇列最多可上傳檔案數量,預設為999
                'auto': false,                                 //選擇檔案後是否自動上傳,預設為true
                'multi': true,                                 //是否為多選,預設為true
                'removeCompleted': true,                       //是否完成後移除序列,預設為true
                'fileSizeLimit': '10MB',                       //單個檔案大小,0為無限制,可接受KB,MB,GB等單位的字串值
                'fileTypeDesc': 'Image Files',                 //檔案描述
                'fileTypeExts': '*.gif; *.jpg; *.png; *.bmp;*.tif;*.doc;*.xls;*.zip',  //上傳的檔案字尾過濾器
                'onQueueComplete': function (event, data) {                 //所有佇列完成後事件
                    ShowUpFiles($("#Attachment_GUID").val(), "div_files");  //完成後更新已上傳的檔案列表
                    $.messager.alert("提示", "上傳完畢!");                                     //提示完成           
                },
                'onUploadStart' : function(file) {
                    $("#file_upload").uploadify("settings", 'formData', { 'folder': '政策法規', 'guid': $("#Attachment_GUID").val() }); //動態傳引數
                },
                'onUploadError': function (event, queueId, fileObj, errorObj) {
                    //alert(errorObj.type + ":" + errorObj.info);
                }
            });

    </script>

在上面的指令碼中,均有註釋,一看就明白相關的屬性了,不明白的也可以到官方網站去查找了解。值得注意的就是

'uploader': '/FileUpload/Upload'

這行就是提交檔案給MVC的Action進行處理,我們在控制器FileUpload的 Upload處理即可。

另外,在附件上傳完畢後,我們需要對所在的介面進行更新,以便顯示已上傳的列表,那麼我們需要增加下面的函式處理即可。

'onQueueComplete': function (event, data) {   

最後說明非常值得注意的地方,就是檔案上傳的時候,我們需要動態獲取介面上的一些元素的值,作為引數傳遞,那麼我們就需要在onUploadStart函式中進行如下處理。

$("#file_upload").uploadify("settings", 'formData', { 'folder': '政策法規', 'guid': $("#Attachment_GUID").val() }); //動態傳引數

3、上傳元件uploadify的C#後臺處理程式碼

在上面的傳遞引數中,我使用了中文數值,一般情況下,這樣會在後臺拿到中文亂碼,所以我們需要在控制器的Action的函式裡面設定它的內容格式,如下所示。

ControllerContext.HttpContext.Request.ContentEncoding = Encoding.GetEncoding("UTF-8");
ControllerContext.HttpContext.Response.ContentEncoding = Encoding.GetEncoding("UTF-8");
ControllerContext.HttpContext.Response.Charset = "UTF-8";

控制器FileUpload的後臺處理Action程式碼完整如下所示:

    public class FileUploadController : BaseController
    {
        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult Upload(HttpPostedFileBase fileData, string guid, string folder)
        {
            if (fileData != null)
            {
                try
                {
                    ControllerContext.HttpContext.Request.ContentEncoding = Encoding.GetEncoding("UTF-8");
                    ControllerContext.HttpContext.Response.ContentEncoding = Encoding.GetEncoding("UTF-8");
                    ControllerContext.HttpContext.Response.Charset = "UTF-8";

                    // 檔案上傳後的儲存路徑
                    string filePath = Server.MapPath("~/UploadFiles/");
                    DirectoryUtil.AssertDirExist(filePath);

                    string fileName = Path.GetFileName(fileData.FileName);      //原始檔名稱
                    string fileExtension = Path.GetExtension(fileName);         //副檔名
                    string saveName = Guid.NewGuid().ToString() + fileExtension; //儲存檔名稱

                    FileUploadInfo info = new FileUploadInfo();
                    info.FileData = ReadFileBytes(fileData);
                    if (info.FileData != null)
                    {
                        info.FileSize = info.FileData.Length;
                    }
                    info.Category = folder;
                    info.FileName = fileName;
                    info.FileExtend = fileExtension;
                    info.AttachmentGUID = guid;
                    info.AddTime = DateTime.Now;
                    info.Editor = CurrentUser.Name;//登入人
                    //info.Owner_ID = OwerId;//所屬主表記錄ID

                    CommonResult result = BLLFactory<FileUpload>.Instance.Upload(info);
                    if (!result.Success)
                    {
                        LogTextHelper.Error("上傳檔案失敗:" + result.ErrorMessage);
                    }
                    return Content(result.Success.ToString());
                }
                catch (Exception ex)
                {
                    LogTextHelper.Error(ex);
                    return Content("false");
                }
            }
            else
            {
                return Content("false");
            }
        }

        private byte[] ReadFileBytes(HttpPostedFileBase fileData)
        {
            byte[] data;
            using (Stream inputStream = fileData.InputStream)
            {
                MemoryStream memoryStream = inputStream as MemoryStream;
                if (memoryStream == null)
                {
                    memoryStream = new MemoryStream();
                    inputStream.CopyTo(memoryStream);
                }
                data = memoryStream.ToArray();
            }
            return data;
        }

4、上傳元件uploadify在Web開發框架中的介面展示

具體上傳元件在的Web開發框架中介面效果如下所示,下圖是總體的列表中附件的展示。

附件編輯和上傳介面如下所示。

附件資訊檢視效果如下所示:

本系列文章列表如下:

基於MVC4+EasyUI的Web開發框架的系列文章:

相關推薦

基於MVC4+EasyUI的Web開發框架形成--附件元件uploadify的使用

大概一年前,我還在用Asp.NET開發一些行業管理系統的時候,就曾經使用這個元件作為檔案的上傳操作,在隨筆《Web開發中的檔案上傳元件uploadify的使用》中可以看到,Asp.NET中如何使用這個元件進行檔案上傳的,當時上傳檔案的處理主要也是使用ashx一般處理程式來進行處理的。本文主要介紹我的Web開發

(轉)基於MVC4+EasyUI的Web開發框架形成--MVC控制器的設計

cli dex txt strip -1 function 特殊 remote 文章 http://www.cnblogs.com/wuhuacong/p/3284628.html 自從上篇《基於MVC4+EasyUI的Web開發框架形成之旅--總體介紹》總體性的概括,得

基於MVC4+EasyUI的Web開發框架形成--總體介紹

最近花了很多時間在重構和進一步提煉Winform開發框架的工作上,加上時不時有一些專案的開發工作,我部落格裡面介紹Web開發框架的文章比較少,其實以前在單位工作,80%的時間是做Web開發的,很早就形成了自己的一套Web開發框架,但是由於一些個人原因,一直沒有來得及好好整理和推廣,其實那套Web開發框架對大多

基於MVC4+EasyUI的Web開發框架形成--許可權控制

我在上一篇隨筆《基於MVC4+EasyUI的Web開發框架形成之旅--框架總體介面介紹》中大概介紹了基於MVC的Web開發框架的許可權控制總體思路。其中的許可權控制就是分為“使用者登入身份驗證”、“控制器方法許可權控制”、“介面元素許可權控制”三種控制方式,可以為Web開發框架本身提供了很好使用者訪問控制和許

基於MVC4+EasyUI的Web開發框架形成--基類控制器CRUD的操作

在上一篇隨筆中,我對Web開發框架的總體介面進行了介紹,其中並提到了我的《Web開發框架》的控制器的設計關係,Web開發框架沿用了我的《Winform開發框架》的很多架構設計思路和特點,對Controller進行了封裝。使得控制器能夠獲得很好的繼承關係,並能以更少的程式碼,更高效的開發效率,實現Web專案的開

基於MVC4+EasyUI的Web開發框架形成--介面控制元件的使用

在前面介紹了兩篇關於我的基於MVC4+EasyUI技術的Web開發框架的隨筆,本篇繼續介紹其中介面部分的一些使用知識,包括控制元件的賦值、取值、清空,以及相關的使用。 我們知道,一般Web介面包括的介面控制元件有:單行文字框、多行文字框、密碼文字框、下拉列表Combobox、日期輸入控制元件、數值輸入控制元

基於MVC4+EasyUI的Web開發框架形成--MVC控制器的設計

自從上篇《基於MVC4+EasyUI的Web開發框架形成之旅--總體介紹》總體性的概括,得到很多同行的關注和支援,不過上一篇主要是介紹一個總體的介面效果和思路,本系列的文章將逐步介紹其中的細節,本文主要介紹整個Web開發框架中的MVC控制器的設計。在設計之初,我就希望儘可能的減少程式碼,提高程式設計模型的統一

基於MVC4+EasyUI的Web開發框架形成--框架總體介面介紹

在前面介紹了一些關於最新基於MVC4+EasyUI的Web開發框架文章,雖然Web開發框架的相關技術文章會隨著技術的探討一直寫下去,不過這個系列的文章,到這裡做一個總結,展示一下整體基於MVC4+EasyUI的介面效果,讓大家對這款Web開發框架有一個形象的瞭解,介面設計以及相關思路可以借鑑提高,也可以對相關

koa2學習----處理圖片路徑的解決辦法

console.log(ctx.req.file.path.substring(6)) // 單獨處理圖片上傳路徑,擷取public,防止圖片找不到,教程中的方法直接暴露後臺檔案是大忌,雖然可以通過seo手段處理 let imgurlSubstring = ctx.req.file.path

JSP 實用程式簡易檔案元件

Edit:6-19 更新,提供了基於 Servlet(非 JSP)的元件下載,這是一個完整的 Java Web 專案,用 Eclipse 匯入即可,專案原始碼在這裡。檔案上傳,包括但不限於圖片上傳,是 Web 開發中司空見慣的場景,相信各位或多或少都曾寫過這方面相關的程式碼。

Entity Framework 實體框架形成--基於泛型的倉儲模式的實體框架(1)

一些讀者也經常問問一些問題,不過最近我確實也很忙,除了處理日常工作外,平常主要的時間也花在了繼續研究微軟的實體框架(EntityFramework)方面了。這個實體框架加入了很多特性(例如LINQ等),目前也已經應用的比較成熟了,之所以一直沒有整理成一個符合自己開發模式的

前端開發框架總結Angular實用技巧(六)

                                    前端開發框架總結之Angular實用技巧(六)

前端開發框架總結Angular實用技巧(五)

                          前端開發框架總結之Angular實用技巧(五) 上文講了Angular中網路請求相關的知識,掌握了這些,我們就可以

前端開發框架總結Angular實用技巧(四)

                       前端開發框架總結之Angular實用技巧(四) 上文講了Angular中路由的相關的知識,掌握了這些,我們就可以構建比較複雜的頁面

前端開發框架總結Angular實用技巧(三)

                             前端開發框架總結之Angular實用技巧(三) 上文講了Angular中頁面重新整理和資

前端開發框架總結Angular實用技巧(二)

                                前端開發框架總結之Angular實用技巧(二) 上文講了Angular自

前端開發框架總結Angular實用技巧(一)

                              前端開發框架總結之Angular實用技巧(一) 前言: 前一段時間接觸了Angul

前端開發框架總結利用Jtopo實現網路拓撲功能(四)

                     前端開發框架總結之利用Jtopo實現網路拓撲功能(四) 上文我們講了拓撲容器相關的互動設計和實現思路以及一些關鍵技術細節。至此,我們已經覆蓋了結

前端開發框架總結利用Jtopo實現網路拓撲功能(三)

                     前端開發框架總結之利用Jtopo實現網路拓撲功能(三) 上文我們講了一些拓撲連線、拓撲文字節點相關的互動設計和實現思路以及一些關鍵技術細節。本文

前端開發框架總結利用Jtopo實現網路拓撲功能(二)

                    前端開發框架總結之利用Jtopo實現網路拓撲功能(二) 上文我們講了一些拓撲結點生成的實際場景設計和實現思路以及一些關鍵技術細節。本文我們繼續我們的拓撲管理