项目里面需要一个上传图片的插件,找了半天没有找到满意的,算了 不找了,自己写一个吧,顺便复习一下js方面的知识。完成之后效果还不错,当然还要继续优化,源码在最后。

介绍一种常见的js插件的写法

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

        })($, window, document, undefined)

这是一种很常见的写法,先说这个开头的 ; 的作用。防止前面上一段scrpit结束的时候没有分号,执行的时候影响到我们定义的脚本。

然后 一个()包起来的匿名函数,再加上(),等于立刻调用。这么写的步骤

等同于

         function  Upload(a,b,c,d) {

        };
  Upload($, window, document, undefined);
 
 即先定义一个函数  Upload,  然后把jquery,window,document,undefined 作为参数执行,

  但是后者的写法等同于谁都能调用 Uplaod 函数,这不是我们想要的 , 使用(function(){})()  好处就是外部无法访问问这个函数内部,保证内部不会被污染

下面我们开始实践写一个jquery上传图片插件,一共有三步

<!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>

经过反复的修改,终于完成了,附上调用和效果图

<!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 = ,
WARNING = ,
FAIL = ,
NOTIFY = , } 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 = ;//5M上限 string[] allow = new string[] { ".jpg", ".jpeg", ".png", ".jif", ".bmp" }; if (System.Web.HttpContext.Current.Request.Files.Count > )
{ var file = System.Web.HttpContext.Current.Request.Files[];
string fix = file.FileName.Substring(file.FileName.LastIndexOf('.')); if (!allow.Contains(fix.ToLower()))//是图片
{
return JSON(ResultState.FAIL, null, "不允许的文件类型");
}
if (file.ContentLength > max**)//最大限制
{
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

如何写一个Js上传图片插件。的更多相关文章

  1. 给Ionic写一个cordova(PhoneGap)插件

    给Ionic写一个cordova(PhoneGap)插件 之前由javaWeb转html5开发,由于面临新技术,遂在适应的过程中极为挣扎,不过还好~,这个过程也极为短暂:现如今面临一些较为复杂的需求还 ...

  2. 用javascript写一个emoji表情插件

    概述 以我们写的这个emoji插件为例,网上已经有一些相关的插件了,但你总感觉有些部分的需求不能被满足(如:可以自行添加新的表情包而不用去改源代码等等) 详细 代码下载:http://www.demo ...

  3. 让我们纯手写一个js继承吧

    继承在前端逻辑操作中是比较常见的,今天我们就从零开始写一个js的继承方式 在es5中继承实质上是先创建子类的实例对象,然后再将父类的方法添加到this上Parent.call(this),在es6中则 ...

  4. Skywalking-02:如何写一个Skywalking trace插件

    如何写一个Skywalking trace插件 javaagent 原理 美团技术团队-Java 动态调试技术原理及实践 类图 实现 ConsumeMessageConcurrentlyInstrum ...

  5. 写一个js向左滑动删除 交互特效的插件——Html5 touchmove

    需求描述 需要实现类似QQ中对联系人的操作:向左滑动,滑出删除按钮.滑动超过一半时松开则自动滑到底,不到一半时松开则返回原处. 纯js实现 使用了h5的touchmove等事件,以及用js动态改变cs ...

  6. 用原生js来写一个swiper滑块插件

        是不是有点印象了,没错,他的最基本的用法就是左右滑动,插件使用者只需要写几行简单的html和js即可实现一个简单滑动效果,不过你完全可以组合各种元素来适应不同的场景. 当然插件我已经写好了,咱 ...

  7. 写一个Vue loading 插件

    什么是vue插件? 从功能上说,插件是为Vue添加全局功能的一种机制,比如给Vue添加一个全局组件,全局指令等: 从代码结构上说,插件就是一个必须拥有install方法的对象,这个方法的接收的第一个参 ...

  8. 从 0 到 1 到完美,写一个 js 库、node 库、前端组件库

    之前讲了很多关于项目工程化.前端架构.前端构建等方面的技术,这次说说怎么写一个完美的第三方库. 1. 选择合适的规范来写代码 js 模块化的发展大致有这样一个过程 iife => commonj ...

  9. 如何手写一个js工具库?同时发布到npm上

    自从工作以来,写项目的时候经常需要手写一些方法和引入一些js库 JS基础又十分重要,于是就萌生出自己创建一个JS工具库并发布到npm上的想法 于是就创建了一个名为learnjts的项目,在空余时间也写 ...

随机推荐

  1. python学习日记(初识面向对象)

    面向过程 VS 面向对象 面向过程 面向过程的程序设计把计算机程序视为一系列的命令集合,即一组函数的顺序执行.为了简化程序设计,面向过程把函数继续切分为子函数,即把大块函数通过切割成小块函数来降低系统 ...

  2. Codeforces 1079C Playing Piano(记忆化搜索)

    题目链接:Playing Piano 题意:给定长度为n的序列$a_i$,要求得到同样长度的序列$b_i$.满足一下条件: if $a_i < a_{i+1}$ then $b_i < b ...

  3. Linux-Centos破解安装confluene6.3.1

    Centos 安装企业wiki confluence是一个专业的企业知识管理与协同软件,可以用于构建企业wiki.通过它可以实现团队成员之间的协作和知识共享.现在大多数公司都会部署一套confluen ...

  4. UOJ#348 州区划分

    解:有一个很显然的状压...... 就设f[s]表示选的点集为s的时候所有方案的权值和. 于是有f[s] = f[s \ t] * (sum[t] / sum[s])P. 这枚举子集是3n的. 然后发 ...

  5. 如何将JPG格式的图片转换成PNG格式

    study from : https://jingyan.baidu.com/article/6079ad0e63a4fc28ff86db37.html

  6. pta寒假作业2

    题目二币值转换 题目代码 #include<stdio.h> int main (void) { int n, initial_n; scanf("%d", & ...

  7. httpClient4.5 closeableHttpClient用法

    HttpClient一 简介1.尽管java.net包提供了基本通过HTTP访问资源的功能,但它没有提供全面的灵活性和其它很多应用程序需要的功能.HttpClient就是寻求弥补这项空白的组件,通过提 ...

  8. 《JavaScript.DOM》读书笔记

  9. Tuxedo 汇总

    ===================================C/S / Tuxedo 架构/ B/S 架构演进===================================Tuxed ...

  10. Vue-cli 模拟数据库

    vue-cli2.x 版本开发: 新版在build目录下的webpack.dev.conf.js配置本地数据访问: 1,在const portfinder = require(‘portfinder’ ...