如何寫一個Js上傳圖片插件。

項目裏面須要一個上傳圖片的插件,找了半天沒有找到滿意的,算了 不找了,本身寫一個吧,順便複習一下js方面的知識。完成以後效果還不錯,固然還要繼續優化,源碼在最後。css

 

介紹一種常見的js插件的寫法html

 

    ; (function ($, window, document, undefined) {
 
        })($, window, document, undefined)

這是一種很常見的寫法,先說這個開頭的 ; 的做用。防止前面上一段scrpit結束的時候沒有分號,執行的時候影響到咱們定義的腳本。jquery

而後 一個()包起來的匿名函數,再加上(),等於馬上調用。這麼寫的步驟git

等同於後端

         function  Upload(a,b,c,d) {
 
        };
  Upload($, window, document, undefined);
 
 即先定義一個函數  Upload,  而後把jquery,window,document,undefined 做爲參數執行,

可是後者的寫法等同於誰都能調用 Uplaod 函數,這不是咱們想要的 , 使用(function(){})() 好處就是外部沒法訪問問這個函數內部,保證內部不會被污染

 

下面咱們開始實踐寫一個jquery上傳圖片插件,一共有三步 api

 

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title></title>
    <script src="js/jquery-1.10.2.min.js"></script>
</head>
<body>


    <script>

        ; (function ($, window, document, undefined) {

            //第一步,定義這個函數,也就是我們要寫的插件的主體
            var Upload = function () {
                console.log("hello world")
            };
           //第二步,將Upload賦給window,做爲window對象的一個屬性
      window.Upload = Upload;
})(
jQuery, window, document, undefined)

//第三步,開始調用 var upload = new Upload();

</script>
</body>
</html>

 

固然,咱們作的這個上傳圖片插件要有一些功能,數組

1,能夠自定義一些屬性,好比上傳圖片的後端地址,上傳圖片的大小限制,數量限制,等等函數

2,提供一些可供外部調用的api,好比設置當前的內容,獲取當前的內容,等等優化

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title></title>
    <script src="js/jquery-1.10.2.min.js"></script>
</head>
<body>


    <script>

        ; (function ($, window, document, undefined) {

            //第一步,定義這個函數,也就是我們要寫的插件的主體
            var Upload = function (el, setting) {

                this._default = {
                    maxcount: 5,//默認最大數量5
                    maxsize: 5,//默認圖片最大5M

                };

                this._options = $.extend(this._default, setting);//經過$.extend 函數可讓兩個對象合併,獲得一個新的對象,options來存放配置的屬性

              
                this.getValue = function () {

                    console.log(this._options);
                };


                this.setValue = function (arr) {

                };
            }

            //第二步,將Upload賦給window,做爲window對象的一個屬性
              window.Upload = Upload;
          
           })(jQuery, window, document, undefined)


        //第三步,開始調用
        var upload = new Upload({"url":"/tools/upload","maxcount":10});  //建立實例
            upload.getValue();                    //在外部調用api
 
 
 
 
</script> </body> </html>

通過反覆的修改,終於完成了,附上調用和效果圖ui

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title></title>

    <link href="css/mini-upload.css" rel="stylesheet" />
    <script src="js/jquery-1.10.2.min.js"></script>
    <script src="js/mini-upload.js"></script>
</head>
<body>



    <!--第一步,建立一個div容器-->

    <div id="test"></div>


    <input type="button" onclick="getvalue()" value="獲取當前值" />
    <input type="button" onclick="setvalue()" value="設置當前值" />
    <script>

 
         //第二步,實例化一個插件對象 

        var upload = new Upload("#test", {
            // data:[], //設置默認的值
            url: "/tools/upload"
        });




        //獲取當前插件的值,返回一個數組,是全部圖片地址的數組
        function getvalue() {


            console.log(upload.getValue());

        }
            //設置當前的值,返回一個數組,是全部圖片地址的數組

        function  setvalue() {

            var arr = ["https://ss1.baidu.com/6ONXsjip0QIZ8tyhnq/it/u=3890934586,2525313398&fm=58&s=37AAF104D22336A5C63010930300C080"
                , "https://ss0.baidu.com/6ONWsjip0QIZ8tyhnq/it/u=2420047149,2850547244&fm=58&s=49099B555E23771B16B104F80300C02F"];
 
            upload.setValue(arr);

        }

    </script>
</body>
</html>

 

 

也就200行代碼

後端代碼

 
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.IO;
using System.Linq;
using System.Text;
using System.Web;
using System.Web.Caching;
using System.Web.Mvc;

namespace MiniUpload.Controllers
{
    public enum ResultState
    {

        SUCCESS = 0,
        WARNING = 2,
        FAIL = 4,
        NOTIFY = 8,
        
    }

    public class ToolsController : Controller
    {
        public JsonResult JSON(ResultState state, object data = null, string msg = null)
        {
            JsonResult j = new JsonResult();

            string m = state.ToString();
            if (!string.IsNullOrEmpty(msg))
            {
                m = msg;

            }

            j.Data = new { msg = m, code = (int)state, data = data };
            j.JsonRequestBehavior = JsonRequestBehavior.AllowGet;
            return j;
        }


        public ActionResult Upload(  )
        {
            try
            {
                int max = 5;//5M上限
            
                string[] allow = new string[] { ".jpg", ".jpeg", ".png", ".jif", ".bmp" };
              
             
                if (System.Web.HttpContext.Current.Request.Files.Count > 0)
                {

                    var file = System.Web.HttpContext.Current.Request.Files[0];
                    string fix = file.FileName.Substring(file.FileName.LastIndexOf('.'));
                   
                  
                    if (!allow.Contains(fix.ToLower()))//是圖片
                    {
                        return JSON(ResultState.FAIL, null, "不容許的文件類型");
                    }
                    if (file.ContentLength > max*1024*1024)//最大限制
                    {
                        return JSON(ResultState.FAIL, null, "超出了最大限制 ");
                    }

                    string path = "/UploadFile";
                    string dic = Server.MapPath(path);

                    if (!System.IO.File.Exists(dic))
                    {
                        System.IO.Directory.CreateDirectory(dic);
                    }
                        
                    string filename = path+"/" + Guid.NewGuid().ToString() + fix;
                  

                    file.SaveAs(Server.MapPath(filename));


                    string url = "http://" + System.Web.HttpContext.Current.Request.Url.Authority + filename;



                    return JSON(ResultState.SUCCESS,  url);
                }
                return JSON(ResultState.FAIL, null, "NoFile");
            }
            catch (Exception e)
            {

                return JSON(ResultState.FAIL, e.ToString());
            }
        }
       
    }
}

 

實踐用起來還行,固然後面還要繼續改進

附上 源碼地址     https://gitee.com/unclescar/mini-upload

相關文章
相關標籤/搜索