WebUploader多圖片上傳2


【項目相關】MVC中使用WebUploader進行圖片預覽上傳以及編輯

  項目中需要用到多圖片上傳功能,於是在百度搜了一下,首先使用了kissy uploader,是由阿里前端工程師們發起創建的一個開源 JS 框架中的一個上傳組件。。。但,后面問題出現了。

 在對添加的信息進行重新編輯的時候,這些圖片怎么辦?由於對js不是很熟悉,就沒有想去修改這個組件的代碼。只有重新尋找合適的組件,於是就找到了百度的WebUploader,下面簡要描述一下該組件在MVC中的使用,包括圖片的上傳和預覽,以及在編輯界面對圖片的處理辦法。

  先來一張效果圖:

  

(一)圖片的上傳和預覽

  (1)下載WebUploader

  (2)將下載的文件添加到你的項目中,一般這幾個就夠了   

    <script src="~/Script/jquery-1.8.2.min.js"></script>
    <!--引入Css-->
    <link href="~/CSS/webuploader.css" rel="stylesheet" />
    <!--引入Js-->
    <script src="~/Script/webuploader.js"></script>  

  (3)在視圖上放一個放圖片的容器,以及一個選擇圖片文件的按鈕

<div id="fileList">  </div>
  <div class="cp_img_jia" id="filePicker"></div>

  (4)然后就是用js來初始化WebUploader,這段代碼主要也是借鑒了網上的一個Demo,找不到出處了,在此表示感謝。 

復制代碼
 var applicationPath = window.applicationPath === "" ? "" : window.applicationPath || "../../";
    var $ = jQuery,
        $list = $('#fileList'),
      ratio = window.devicePixelRatio || 1,
      // 縮略圖大小
      thumbnailWidth = 90 * ratio,
      thumbnailHeight = 90 * ratio,

      // Web Uploader實例
      uploader;
    $(function () {
        uploader = WebUploader.create({
            // 選完文件后,是否自動上傳。
            auto: true,

            disableGlobalDnd: true,
            // swf文件路徑
            swf: applicationPath + '/Script/Uploader.swf',

            // 文件接收服務端。
            server: applicationPath + '/EstSource/UpLoadProcess',

            // 選擇文件的按鈕。可選。
            // 內部根據當前運行是創建,可能是input元素,也可能是flash.
            pick: '#filePicker',

            //只允許選擇圖片
            accept: {
                title: 'Images',
                extensions: 'gif,jpg,jpeg,bmp,png',
                mimeTypes: 'image/*'
            }
        });

        // 當有文件添加進來的時候
        uploader.on('fileQueued', function (file) {
            var $li = $(
                    '<div id="' + file.id + '" class="cp_img">' +
                        '<img>' +
                    '<div class="cp_img_jian"></div></div>'
                    ),
                $img = $li.find('img');


            // $list為容器jQuery實例
            $list.append($li);

            // 創建縮略圖
            // 如果為非圖片文件,可以不用調用此方法。
            // thumbnailWidth x thumbnailHeight 為 100 x 100
            uploader.makeThumb(file, function (error, src) {
                if (error) {
                    $img.replaceWith('<span>不能預覽</span>');
                    return;
                }
                $img.attr('src', src);
            }, thumbnailWidth, thumbnailHeight);
        });

        // 文件上傳過程中創建進度條實時顯示。
        uploader.on('uploadProgress', function (file, percentage) {
            var $li = $('#' + file.id),
                $percent = $li.find('.progress span');

            // 避免重復創建
            if (!$percent.length) {
                $percent = $('<p class="progress"><span></span></p>')
                        .appendTo($li)
                        .find('span');
            }

            $percent.css('width', percentage * 100 + '%');
        });

        // 文件上傳成功,給item添加成功class, 用樣式標記上傳成功。
        uploader.on('uploadSuccess', function (file, response) {

            $('#' + file.id).addClass('upload-state-done');
            //將上傳的url保存到數組
            PhotoUrlArray.push(new PhotoUrl(response.id, response.filePath));
        });

        // 文件上傳失敗,顯示上傳出錯。
        uploader.on('uploadError', function (file) {
            var $li = $('#' + file.id),
                $error = $li.find('div.error');

            // 避免重復創建
            if (!$error.length) {
                $error = $('<div class="error"></div>').appendTo($li);
            }

            $error.text('上傳失敗');
        });

        // 完成上傳完了,成功或者失敗,先刪除進度條。
        uploader.on('uploadComplete', function (file) {
            $('#' + file.id).find('.progress').remove();
        });

        //所有文件上傳完畢
        uploader.on("uploadFinished", function ()
        {
        });//顯示刪除按鈕
        $(".cp_img").live("mouseover", function ()
        {
            $(this).children(".cp_img_jian").css('display', 'block');

        });
        //隱藏刪除按鈕
        $(".cp_img").live("mouseout", function () {
            $(this).children(".cp_img_jian").css('display', 'none');

        });
        //執行刪除方法
        $list.on("click", ".cp_img_jian", function ()
        {

            var Id = $(this).parent().attr("id");
            //刪除該圖片
            uploader.removeFile(uploader.getFile(Id, true));
            $(this).parent().remove();
        });
    });
復制代碼

這段js代碼是用在上傳圖片界面,主要思路如下:

  1)設置圖片為自動上傳:auto: true,

  2)每次返回的json對象保存起來,代碼如下:

復制代碼
       //保存從后台返回的圖片url
                var PhotoUrlArray = new Array();
                function PhotoUrl(id, filePath) {
                    this.id = id;
                    this.filePath = filePath;
                }
......
         // 文件上傳成功執行方法
                uploader.on('uploadSuccess', function (file, response) {
                    $('#' + file.id).addClass('upload-state-done');
                     //將上傳的url保存到數組
                    PhotoUrlArray.push(new PhotoUrl(response.id, response.filePath));
                    });
復制代碼

   3)這里需要注意的是,當用戶上傳圖片后,有可能會進行刪除圖片操作,所以需要在該事件里面,將json對象數組里面相對應的元素進行刪除操作:

復制代碼
             //執行刪除方法
                    $list.on("click", ".cp_img_jian", function ()
                    {

                        var Id = $(this).parent().attr("id");
                        //刪除該圖片
                            uploader.removeFile(uploader.getFile(Id, true));
                            for (var i = 0; i < PhotoUrlArray.length; i++) {
                                if (PhotoUrlArray[i].id == Id) {
                                    PhotoUrlArray.remove(i);
                                }
                        }
                        $(this).parent().remove();
                    });                
復制代碼

(5)視圖的代碼就差不多了,現在在Controller里新建一個Action用於保存圖片並返回圖片路徑,由於該組件是一個文件一個文件的上傳到服務端,所以,在用戶沒有點擊保存的情況下,上傳的圖片只能保存到臨時文件夾里面,當用戶保存全部信息的時候,將保存到臨時文件夾的文件移動到正式文件夾,並保存相對應的圖片url到數據庫。

復制代碼
 public ActionResult UpLoadProcess(string id, string name, string type, string lastModifiedDate, int size, HttpPostedFileBase file)
        {
            //保存到臨時文件夾
            string urlPath = "../Upload/temp";
            string filePathName = string.Empty;

            string localPath = Path.Combine(HttpRuntime.AppDomainAppPath, "Upload/temp");
            if (Request.Files.Count == 0)
            {
                return Json(new { jsonrpc = 2.0, error = new { code = 102, message = "保存失敗" }, id = "id" });
            }

            string ex = Path.GetExtension(file.FileName);
            filePathName = Guid.NewGuid().ToString("N") + ex;
            if (!System.IO.Directory.Exists(localPath))
            {
                System.IO.Directory.CreateDirectory(localPath);
            }
            file.SaveAs(Path.Combine(localPath, filePathName));

            return Json(new
            {
                jsonrpc = "2.0",
                id = id,
                filePath = urlPath + "/" + filePathName//返回一個視圖界面可直接使用的url
            });

        }
復制代碼

  (二)編輯視圖界面圖片的處理

  (1)主要思路:在對信息進行編輯的時候,也需要使用該控件來上傳圖片,所以為了保持和上傳圖片預覽格式一致,需要在初始化的時候,將后台傳回的圖片顯示在圖片容器里面。

復制代碼
      <div id="fileList">
                @foreach (var item in @ViewBag.picList)
                       {
                        <div id=@item.picId class="cp_img">
                        <img src="@item.picUrl" />
                         <div class="cp_img_jian"></div>
              </div>
          }
       </div>
復制代碼

    除了這里初始化預覽圖片外,還需要在獲取圖片url的方法上進行改造,這里就是關鍵。在視圖里,有一個實體屬性PhotoUrl用來保存所有的url圖片。

復制代碼
 function GetPhotoUrl() {
        var photoUrls = "";
        $("#fileList img").each(function (i) {
            if ($(this).attr("src").indexOf('UpLoad/photos/') > 0) {
                photoUrls = photoUrls + $(this).attr("src")+",";
            }
        });
        for (var i = 0; i < PhotoUrlArray.length; i++) {
            photoUrls = photoUrls + PhotoUrlArray[i].filePath;
        }
        $("#PicUrls").val(photoUrls);
    }
復制代碼

這個方法在上傳視圖中也是用來保存圖片urls的,大同小異,稍微修改一下就行。

(2)后端上傳服務都是使用的一個Action,沒有不同的地方,主要的區別是在保存的時候對圖片url的處理上,每個系統都不一樣,這里就不敘述了。

 

總結:項目做了幾個了,可技術總沒有提升上去,得突破自己才行!從現在開始,記錄每一個在項目中值得記錄的東西。

 

 補充一下!!!

最近有很多人加我,想要這個源碼,我在這里提供百度雲盤鏈接,需要的請自己下載!謝謝。。。

   鏈接:http://pan.baidu.com/s/1jHXziZ0 密碼:q919


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM