项目里面需要一个上传图片的插件,找了半天没有找到满意的,算了 不找了,自己写一个吧,顺便复习一下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. magento 2 Check https://getcomposer.org/doc/articles/troubleshooting.md#memory-limit-errors for more info on how to handle out of memory errors.%

    Check https://getcomposer.org/doc/articles/troubleshooting.md#memory-limit-errors for more info on h ...

  2. CAN总线为什么要有两个120Ω的终端电阻?

    1  CAN总线为什么要有两个120Ω的终端电阻? 2 终端电阻的作用是使阻抗连续,消除反射,那为什么只在物理上最远的两个节点加这个匹配电阻,而不是在所有的节点都加上匹配电阻? 高频信号传输时,信号波 ...

  3. 微信小程序之canvas 文字断行和省略号显示

    文字的多行处理在dom元素中很好办.但是canvas中没有提供方法,只有通过截取指定字符串来达到目的. 那么下面就介绍我自己处理的办法: wxml: <canvas canvas-id='wor ...

  4. 系统磁盘优化——"/var/spool/postfix/maildrop"

    文件清理 最近某服务器磁盘空间告警,在排查过程中发现"/var/spool/postfix/maildrop"目录下堆积了很多小文件,起初想直接删除,但是使用rm删除是提示“参数列 ...

  5. Pandas系列(十)-转换连接详解

    目录 1. 拼接 1.1 append 1.2 concat 2. 关联 2.1 merge 2.2 join 数据准备 # 导入相关库 import numpy as np import panda ...

  6. 数据库学习之MySQL进阶

    数据库进阶   一.视图                                                                            数据库视图是虚拟表或逻辑 ...

  7. Python 文件行数读取的三种方法

    Python三种文件行数读取的方法: #文件比较小 count = len(open(r"d:\lines_test.txt",'rU').readlines()) print c ...

  8. Form -- 文件上传

    当我们选中文件,点击上传时即可. 而此按钮一般是一张图片覆盖了一个input标签而以.基于这个原理我们可以定制自己喜欢的样式 <div style="text-align: cente ...

  9. [物理学与PDEs]第1章习题14 求解 rot 方程

    设向量函数 ${\bf B}(x,y,z)=(B_x,B_y,B_z)$ 在 $z\neq 0$ 时具有一阶连续偏导数, 在 $z=0$ 时具有第一类间断, 且 $$\bex \Div{\bf B}= ...

  10. Nginx web 服务器 安装篇

    Nginx介绍: 静态web服务器有Nginx .Apache .lighttpd等 目前国内用的最常见的就是Nginx 和Apache 是一个开源的.支持高性能.高并发的www服务和代理服务软件,N ...