LayUI中的内置模块之 图片/文件上传 layui.upload

2023-11-02

前言

最近在准备找工作的事项,但是作为一个后台也是需要了解一些前端框架的。就目前的来说有大火的VUE,但是VUE还是存在一定的学习成本,所以决定先从对后台友好的LayUI开始入手先做一些小项目练练手,后面会考虑使用VUE+ElementUI做一个大型一点的SAAS系统。查阅资料后得到如下文章,作为学习记录使用。

图片/文件上传 - layui.upload

上传模块自 layui 2.0 的版本开始,进行了全面重写,这使得它不再那么单一,它所包含的不仅是更为强劲的功能,还有灵活的 UI。任何元素都可以作为上传组件来调用,譬如按钮、图片、普通的 DIV 等等,而不再是一个单调的 file 文件域。
模块加载名称:upload

快速使用

一切从小试牛刀开始。通常情况下,我们上传文件是借助 type=“file” 的 input 标签来完成的,但非常遗憾的是,它不能很好地与其它表单元素并存,所以我们常常要单独为它做一个业务层面的“异步上传”,即先让图片上传,再和其它表单一起提交保存。下面是一个小示例:
在这里插入图片描述

这原本只是一个普通的 button,正是 upload 模块赋予了它“文件选择”的特殊技能。当然,你还可以随意定制它的样式,而不是只局限于按钮。

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>upload模块快速使用</title>
  <link rel="stylesheet" href="/static/build/layui.css" media="all">
</head>
<body>
 
<button type="button" class="layui-btn" id="test1">
  <i class="layui-icon">&#xe67c;</i>上传图片
</button>
 
<script src="/static/build/layui.js"></script>
<script>
layui.use('upload', function(){
  var upload = layui.upload;
   
  //执行实例
  var uploadInst = upload.render({
    elem: '#test1' //绑定元素
    ,url: '/upload/' //上传接口
    ,done: function(res){
      //上传完毕回调
    }
    ,error: function(){
      //请求异常回调
    }
  });
});
</script>
</body>
</html>

核心方法与基础参数选项

使用 upload 模块必须与 upload.render(options) 方法打交道,其中的 options即为基础参数,它是一个对象。

var upload = layui.upload; //得到 upload 对象
 
//创建一个上传组件
upload.render({
  elem: '#id'
  ,url: ''
  ,done: function(res, index, upload){ //上传后的回调
  
  } 
  //,accept: 'file' //允许上传的文件类型
  //,size: 50 //最大允许上传的文件大小
  //,……
})

从 layui 2.1.0 开始,允许你直接在元素上设定基础参数,如:

【HTML】
<button class="layui-btn test" lay-data="{url: '/a/'}">上传图片</button>
<button class="layui-btn test" lay-data="{url: '/b/', accept: 'file'}">上传文件</button>
 
【JS】
upload.render({
  elem: '.test'
  ,done: function(res, index, upload){
    //获取当前触发上传的元素,一般用于 elem 绑定 class 的情况,注意:此乃 layui 2.1.0 新增
    var item = this.item;
  }
})

更多支持的参数详见下表,合理的配置它们,应对各式各样的业务需求。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

上传接口

设定一个 URL 地址给 url 参数,用来告诉 upload 模块的服务端上传接口。像你平时使用Ajax一样。如:

upload.render({
  elem: '#id'
  ,url: '/api/upload/' //必填项
  ,method: ''  //可选项。HTTP类型,默认post
  ,data: {} //可选项。额外的参数,如:{id: 123, abc: 'xxx'}
});

该接口返回的相应信息(response)必须是一个标准的 JSON 格式,如:

{
  "code": 0
  ,"msg": ""
  ,"data": {
    "src": "http://cdn.layui.com/123.jpg"
  }
}   

注意1:你不一定非得按照上述格式返回,只要是合法的 JSON 字符即可。其响应信息会转化成JS对象传递给 done 回调。
注意2:如果上传后,出现文件下载框(一般为ie下),那么你需要在服务端对response的header设置 Content-Type: text/html

选择文件的回调

在文件被选择后触发,该回调会在 before 回调之前。一般用于非自动上传(即 auto: false )的场景,比如预览图片等。

upload.render({
  elem: '#id'
  ,url: '/api/upload/'
  ,auto: false //选择文件后不自动上传
  ,bindAction: '#testListAction' //指向一个按钮触发上传
  ,choose: function(obj){
    //将每次选择的文件追加到文件队列
    var files = obj.pushFile();
    
    //预读本地文件,如果是多文件,则会遍历。(不支持ie8/9)
    obj.preview(function(index, file, result){
      console.log(index); //得到文件索引
      console.log(file); //得到文件对象
      console.log(result); //得到文件base64编码,比如图片
      
      //obj.resetFile(index, file, '123.jpg'); //重命名文件名,layui 2.3.0 开始新增
      
      //这里还可以做一些 append 文件列表 DOM 的操作
      
      //obj.upload(index, file); //对上传失败的单个文件重新上传,一般在某个事件中使用
      //delete files[index]; //删除列表中对应的文件,一般在某个事件中使用
    });
  }
});   

事实上这是一个非常实用的存在,可轻松应对复杂的列表文件上传管理。具体可移步到 示例 页面,里面有一个文件列表的小例子。

文件上传前的回调

在 choose 回调之后、done/error 回调之前触发。返回的参数完全类似 choose 回调。一般用于上传完毕前的loading、图片预览等。

upload.render({
  elem: '#id'
  ,url: '/api/upload/'
  ,before: function(obj){ //obj参数包含的信息,跟 choose回调完全一致,可参见上文。
    layer.load(); //上传loading
  }
  ,done: function(res, index, upload){
    layer.closeAll('loading'); //关闭loading
  }
  ,error: function(index, upload){
    layer.closeAll('loading'); //关闭loading
  }
});  

上传接口请求成功的回调

在上传接口请求完毕后触发,但文件不一定是上传成功的,只是接口的响应状态正常(200)。回调返回三个参数,分别为:服务端响应信息、当前文件的索引、重新上传的方法

upload.render({
  elem: '#id'
  ,url: '/api/upload/'
  ,done: function(res, index, upload){
    //假设code=0代表上传成功
    if(res.code == 0){
      //do something (比如将res返回的图片链接保存到表单的隐藏域)
    }
    
    //获取当前触发上传的元素,一般用于 elem 绑定 class 的情况,注意:此乃 layui 2.1.0 新增
    var item = this.item;
    
    //文件保存失败
    //do something
  }
});      

上传请求失败的回调

当请求上传时出现异常时触发(如网络异常、404/500等)。回调返回两个参数,分别为:当前文件的索引、重新上传的方法

upload.render({
  elem: '#id'
  ,url: '/api/upload/'
  ,error: function(index, upload){
    //当上传失败时,你可以生成一个“重新上传”的按钮,点击该按钮时,执行 upload() 方法即可实现重新上传
  }
}); 

多文件上传完毕后的状态回调

只有当开启多文件时(即 multiple: true),该回调才会被触发。回调返回一个 object 类型的参数,包含一些状态数据:

upload.render({
  elem: '#id'
  ,url: '/api/upload/'
  ,multiple: true
  ,allDone: function(obj){ //当文件全部被提交后,才触发
    console.log(obj.total); //得到总文件数
    console.log(obj.successful); //请求成功的文件数
    console.log(obj.aborted); //请求失败的文件数
  }
  ,done: function(res, index, upload){ //每个文件提交一次触发一次。详见“请求成功的回调”
  
  }
}); 

文件上传进度的回调

在网速一般的情况下,大文件的上传通常需要一定时间的等待,而浏览器并不会醒目地告知你它正在努力地上传中,此时为了提升用户体验,我们可以通过该回调制作一个进度条。注:该回调为 layui 2.5.5 新增

upload.render({
  elem: '#id'
  ,url: '/api/upload/'
  ,progress: function(n, elem, res, index){
    var percent = n + '%' //获取进度百分比
    element.progress('demo', percent); //可配合 layui 进度条元素使用
    
    console.log(elem); //得到当前触发的元素 DOM 对象。可通过该元素定义的属性值匹配到对应的进度条。
    console.log(res); //得到 progress 响应信息
    console.log(index); //得到当前上传文件的索引,多文件上传时的进度条控制,如:
    element.progress('demo-'+ index, n + '%'); //进度条
  }
});

重载实例

有时你可能需要对 upload.render() 实例进行重载,通过改变一些参数(如将上传文件重置为只上传图片等场景)来重置功能。如:

//创建一个实例
var uploadInst = upload.render({
  elem: '#id'
  ,url: '/api/upload/'
  ,size: 1024*5 //限定大小
});
 
//重载该实例,支持重载全部基础参数
uploadInst.reload({
  accept: 'images' //只允许上传图片
  ,acceptMime: 'image/*' //只筛选图片
  ,size: 1024*2 //限定大小
}); 

注意:该方法为 layui 2.5.0 开始新增

重新上传

在执行 upload.render(options) 方法时,其实有返回一个实例对象,以便对完成重新上传等操作。注意:这是对当前上传队列的全局重新上传,而 choose 回调返回的 obj.upload(index, file) 方法则是对单个文件进行重新上传。如:

var uploadInst = upload.render({
  elem: '#id'
  ,url: '/api/upload/'
  ,choose: function(obj){
    obj.preview(function(index, file, result){
      //对上传失败的单个文件重新上传,一般在某个事件中使用
      //obj.upload(index, file);
    });
  }
});
 
//重新上传的方法,一般在某个事件中使用
//uploadInst.upload(); 

跨域上传

有些时候,可能会涉及到文件跨域操作,过去版本的 upload 模块最大的缺陷恰恰在于这里。而从 layui 2.0 的版本开始,我们已经对 跨域做了支持。但鉴于代码的冗余度等多方面考虑,在IE9以下版本环境中,仍然不支持跨域。其它所有版本的IE和Chrome/FireFox等高级浏览器均支持。

那么,需要你怎么做?通常来说,是借助 CORS(跨资源共享) 方案,即对接口所在的服务器设置:Access-Control-Allow-Origin 详见Google,配置起来还是挺简单的。而至于域名限制,一般是服务端程序中去做处理。这里不做过多赘述。
官网链接

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LayUI中的内置模块之 图片/文件上传 layui.upload 的相关文章

  • @CacheEvict 清除多个key

    借用 Caching实现 入参是基本类型的 Caching evict CacheEvict value Cache CONSTANT key CacheKey SINGLE ROLE NAME roleId CacheEvict valu

随机推荐

  • 遗传算法程序 matlab(转)

    遗传算法程序 matlab 一 本程序收集于网络 本人并未运行 如有问题请与作者联系 如有侵权请告之 转载 http hi baidu com hopeasy blog item c82182c302781650b319a802 html
  • DirectX11 顶点和顶点布局

    顶点和顶点布局 1 如何描述顶点 5 5 1节已经讲过 在Direct3D中 顶点由空间位置和各种附加属性组成 Direct3D可以让我们灵活地建立属于我们自己的顶点格式 换句话说 它允许我们定义顶点的分量 要创建一个自定义的顶点格式 我们
  • Build finished with errors/Executable Not Found

    项目场景 iOS工程 点击运行 或者点击编译 问题描述 能运行起来 但是报错 报错内容如下图 报了build finished with errors的错误 但是具体原因却没有提示 原因分析 编译的错误 但是工程却能运行起来 就很奇怪 报错
  • JAVA数据集合:Set与Get效率对比

    1 实例测试代码 pre class java 1 ArrayList set sort elements and list elements public static void printArrList List pre
  • line-height:1;的理解

    先看张图吧 line height如上图的两条基线的距离 即两条大红线的距离 也可以说是两条蓝线的距离 如图中标注 但是严谨地说应该是两条基线的距离 这也就解释为什么line height和height的值一样的时候 为什么就是行内元素居中
  • Java 4-3、项目运行环境配置

    项目运行环境配置 注 使用Spring自带的application properties 目的 一次性配置开发环境和正式环境不同的参数设置 一 创建application properties 使用 spring profiles acti
  • 7.14华为模拟面试

    你对MySQL的慢查询优化有了解吗 没有了解 https blog csdn net weixin 45764765 article details 124112232 约瑟夫环剩余问题 模拟 有特殊用例超时通过不了 class Solut
  • 灰度重采样的方法分为_数字图像灰度重采样

    图像重采样的依据是辛克 SINC 函数 但由于辛克函数是定义在无穷域上的 又包括三角函数的计算 实际使用不方便 因此人们采用了一些近似函数代替它 据此产生了三种常用的重采样方法 最邻近像元采样法 双线性内插法和双三次卷积重采样法 最邻近像元
  • Linux——管理容器服务

    一 自动启动容器 为rootless容器创建systemd用户单元文件 可以使用systemctl命令来管理它们 通过启用服务 可以确保关联容器在主机启动时启动 如果容器在rootless中运行 则可以从非特权用户帐户管理这些服务 以提高安
  • deny of sb sth_句式分析(deny, be denied us)

    As long as you have faith in your cause salvation will not be denied us 请问 1 这句话最后需要加to吗 2 deny sb sth这个结构里面谁是直接宾语 答 den
  • 测试用例设计方法---边界值分析法

    1 边界值分析法 边界值分析法就是对输入或输出的边界值进行测试的一种黑盒测试方法 一般 我们在设计测试用例的时候 需要将等价类法和边界值法结合起来使用 1 1 边界范围节点 选取正好等于 刚好等于 刚好小于边界得值作为测试数据 上点 边界上
  • 区块链概念已足够庞杂,现当回归技术本身!

    如果把区块链放到人类社会里来看待的话 早期的区块链其实是一个百家争鸣的时代 我们都知道在春秋战国时期 百家争鸣造就了儒家 法家 墨家等诸多学术门派 最终归于秉持法家的秦国 区块链时代同样如此 之所以会出现如此多的区块链的概念 正是由于人们对
  • 删除分页符时,保持页面格式不乱

    删除分页符时 保持页面格式不乱 1 将光标移到在页面最后 回车 2 选中段落标记后面的 所有 内容 也可以用快捷键ctrl shift end delete 1 将光标移到在页面最后 回车 2 选中段落标记后面的所有内容 也可以用快捷键ct
  • PCIE结构拓扑(RC、EP、SWITCH)介绍

    1 PCIE典型结构拓扑 1 个人理解 红色方框部分一般是在芯片内部集成 对外可提供多个PCIE接口 2 芯片提供的PCIE接口 可以接EP设备 PCI桥 Switch设备 2 RC Root Complex 个人理解 RC在功能上和Swi
  • python 计算置信区间_python 计算数据中值的置信区间

    最近给导师报告处理WISE数据的进展时 对于处理WISE光变导师希望我对每一个观测区间的星等数值给中值的置信度 计算数据的中值95 的置信区间 假设有一组数据如下 data 0 1 2 4 0 1 0 7 1 4 0 9 3 2 0 2 0
  • ApacheBeam:大数据处理的一大神器!

    你知道被认为继MapReduce GFS BigQuery等之后 Google在大数据处理领域对开源社区的又一大贡献是哪个项目吗 答案是ApacheBeam 事实上 Beam 这个项目名称已经很清楚地表明了它的设计初衷 统一批处理 Batc
  • MySQL数据查询 - 联合查询

    联合查询 1 内连接查询 内连接查询 在实际开发中 我们会联合多个表来实现查询 比如把班级表和学生表联合起来就同时可以看到班级 老师和学员的信息 一个班级表 这种只有2张表匹配的行才能显示的连接方式在Mysql 中称之为内连接 INNER
  • 回文词(Uva 401)

    输入一个字符串 判断它是否为回文串以及镜像串 输入字符串保证不含数字0 所谓回文串 就是反转以后与原串相同 如abba和madam 所谓镜像串 就是左右镜像之后和原串相同 如2S和3AIAE 注意 并不是每个字符在镜像之后都能得到一个合法字
  • 以给定值x为基准将单链表分割为两部分,所有小于x的结点都排在大于或等于x的结点之前。

    include LinkList cpp 现单链表的各种基本运算的算法文件单链表的基本运算算法 yyy zxc的博客 CSDN博客 void Split02 LinkNode L ElemType x LinkNode p L gt nex
  • LayUI中的内置模块之 图片/文件上传 layui.upload

    前言 最近在准备找工作的事项 但是作为一个后台也是需要了解一些前端框架的 就目前的来说有大火的VUE 但是VUE还是存在一定的学习成本 所以决定先从对后台友好的LayUI开始入手先做一些小项目练练手 后面会考虑使用VUE ElementUI