上传媒体文件--添加显示进度条   layui的upload控件

详细上传功能请参考博客:上传文件--媒体文件+获取上传文件的属性信息 layui的upload控件 - じ逐梦 - 博客园 (cnblogs.com)

显示效果:

参考文献:(12条消息) Layui表格中文件上传显示进度条_layui上传文件进度条_no_delay_su的博客-CSDN博客

实现过程:

1、table映射显示进度条列

  1. /*
  2. * *
  3. * 展示选择文件
  4. * */
  5. function showChoose() {
  6. //映射table显示选择的媒体
  7. table.render({
  8. elem: '#redioInfo' //显示分页表格的html元素
  9. , cols: [[
  10. { title: '文件名称', field: 'mp3Name' }, //渲染返回数据
  11. { title: '文件大小', field: 'filesize', width: '20%' }, //渲染返回数据
  12. { title: '上传进度', field: 'schedule', align: 'center', templet: schedule }, //渲染返回数据(进度条)
  13. { title: '文件状态', field: 'mp3state', hide: true }, //渲染返回数据
  14. { title: '文件索引', field: 'Index', hide: true }, //渲染返回数据 --右侧显示图标使用
  15. { title: '文件lastModified', field: 'lastModified', hide: true }, //渲染返回数据-整理文件队列使用
  16. { title: 'filter', field: 'filter', hide: true },
  17. { title: 'progress', field: 'progress', hide: true },
  18. { title: '操作', field: 'stateinfo', templet: stateinfo, width: '7%' }
  19. ]], limit: 1000, height: '300'
  20. , data: mp3Arr
  21. , done: function (res, curr, count) { //数据渲染完毕的回调
  22. }
  23. });
  24. }

进度条列模板

  1. /**
  2. * 进度条
  3. * @param {any} d
  4. */
  5. function schedule(d) {
  6. d.filter == undefined ? d.filter = d.Index : d.filter;
  7. d.progress == undefined ? d.progress = 100 : d.progress;
  8. var color = 'layui-bg-green';
  9. if (d.progress > 50 && d.progress <= 100) {
  10. color = 'layui-bg-green'
  11. } else if (d.progress > 20 && d <= 50) {
  12. color = 'layui-bg-orange'
  13. }
  14. //设置页面进度条
  15. return '<div class="layui-progress layui-progress-big" lay-showpercent="true" id="' + d.filter + '" lay-filter="progress' + d.filter + '">' +
  16. '<div class="layui-progress-bar ' + color + '" lay-percent="' + d.progress + '%">' +
  17. '</div></div>'
  18. }

2、layui的upload添加program

  1. //上传进度回调 value进度值,由于是进度条同时又是多文件上传不只一个进度条,所以要保证每次进度条的类名不一致,demoCount控制类名,demoFlag保证上下一致,所以该方法一直在被调用
  2. //经过测试 progress的第四个参数是上传文件的Index
    progress: function (value, obj, obj1, obj2) {
           //控制进度条在文件预处理后再开始变化
  3. if (demoFlag) {
  4. //设置页面进度条(调用方法)
  5. setprogress("progress" + obj2, value);
  6. }
  7. },
  1. /**
  2. * 设置页面进度条百分比
  3. * @param {any} div 进度条div
  4. * @param {any} val 值
  5. */
  6. function setprogress(div, val) {
  7. element.progress(div, val + '%') //设置页面进度条
  8. }

完整JS代码:

  1. var mp3Arr = new Array();
  2. var table;
  3. var element;
  4. var files;//上传文件队列
  5. var demoFlag = false;//控制进度条在文件预处理后再开始变化
  6. var demoCount = ""; //控制progress组件id
  7. layui.use(['upload', 'table', 'element'], function () {
  8. var upload = layui.upload; //得到 upload 对象
  9. table = layui.table; //得到table对象
  10. element = layui.element;//得到element对象
  11. layui.element.render();
  12. //下载执行实例
  13. var uploadInst = upload.render({
  14. elem: '#redio' //绑定元素
  15. , url: '/extavs/avs_medium/savefile' //上传接口
  16. , accept: 'audio' //指定允许上传的文件类型images(图片)、file(所有文件)、video(视频)、audio(音频)
  17. , auto: false //选择文件后不自动上传
  18. , bindAction: '#upInfo'//指定一个按钮触发上传
  19. , acceptMime: 'audio/mpeg' //规定打开文件选择框时,筛选出文件类型audio/mpeg
  20. , multiple: true //是否允许多文件上传。设置 true即可开启。不支持ie8/9
  21. , number: 10 //设置同时可上传的文件数量,一般配合 multiple 参数出现。注意:该参数为 layui 2.2.3 开始新增
  22. , data: { //上传其他参数
  23. id: function () { return usbasic.q("folderid") },
  24. }
  25. , choose: function (res) {
  26. //将每次选择的文件追加到文件队列
  27. files = res.pushFile();
  28. //预读本地文件,如果是多文件则会遍历。(不支持ie8/9)
  29. res.preview(function (index, file, result) {
  30. demoFlag = true;
  31. demoCount = index;
  32. //最重要的
  33. uploadInst.config.elem.next()[0].value = '';
  34. //存入数组中
  35. var mp3Info = { "mp3Name": file.name, "filesize": (file.size / 1024/1024).toFixed(2) + "MB", "schedule": '', "mp3state": 0, "Index": index, "lastModified": file.lastModified, "filter": demoCount, "progress": 100 };
  36. mp3Arr.push(mp3Info);
  37. //是否重复
  38. if (mp3Arr.length > 1) {
  39. for (i = 0; i < mp3Arr.length - 1; i++) {
  40. if (mp3Arr[i].mp3Name == mp3Arr[mp3Arr.length - 1].mp3Name) {
  41. if (mp3Arr[i].mp3state == 1) {
  42.  
  43. usbasic.warnMsg(mp3Arr[i].mp3Name + "本次已上传成功,无需重复上传");
  44. }
  45. delete files[index];
  46. mp3Arr.splice(mp3Arr.length - 1, 1);
  47. }
  48. else if (i >= mp3Arr.length - 1) {
  49. mp3Arr.push(mp3Info);
  50. }
  51. }
  52. }
  53. showChoose();
  54. });
  55. }
  56. , before: function (obj) {//上传前的判断
  57. if (mp3Arr.length < 0) {
  58. usbasic.warnMsg("请选择上传媒体文件!");
  59. return;
  60. }
  61. }
  62. , done: function (res, index, upload) {
  63. if (res.result == 0) {
  64. //usbasic.successMsg(res.msg);
  65. for (var i = 0; i < mp3Arr.length; i++) {
  66. if (mp3Arr[i]["Index"] == index) {
  67. mp3Arr[i]["mp3state"] = 1;
  68. }
  69. }
  70. //删除上传队列中上传成功的对应的文件--防止重复上传
  71. delete files[index];
  72. //映射表格
  73. //showChoose();
  74. }
  75. else {
  76. usbasic.warnMsg(res.msg);
  77. }
  78. //上传完毕回调
  79. }
  80. , error: function (index, upload) {
  81. //请求异常回调
  82. },
  83. progress: function (value, obj, obj1, obj2) { //上传进度回调 value进度值,由于是进度条同时又是多文件上传不只一个进度条,所以要保证每次进度条的类名不一致,demoCount控制类名,demoFlag保证上下一致,所以该方法一直在被调用
  84. if (demoFlag) {
  85. //设置页面进度条
  86. setprogress("progress" + obj2, value);
  87. }
  88. },
  89. });
  90.  
  91. //映射表格
  92. showChoose();
  93. })
  94.  
  95. /*
  96. * *
  97. * 展示选择文件
  98. * */
  99. function showChoose() {
  100. //映射table显示选择的媒体
  101. table.render({
  102. elem: '#redioInfo' //显示分页表格的html元素
  103. , cols: [[
  104. { title: '文件名称', field: 'mp3Name' }, //渲染返回数据
  105. { title: '文件大小', field: 'filesize', width: '20%' }, //渲染返回数据
  106. { title: '上传进度', field: 'schedule', align: 'center', templet: schedule }, //渲染返回数据
  107. { title: '文件状态', field: 'mp3state', hide: true }, //渲染返回数据
  108. { title: '文件索引', field: 'Index', hide: true }, //渲染返回数据 --右侧显示图标使用
  109. { title: '文件lastModified', field: 'lastModified', hide: true }, //渲染返回数据-整理文件队列使用
  110. { title: 'filter', field: 'filter', hide: true },
  111. { title: 'progress', field: 'progress', hide: true },
  112. { title: '操作', field: 'stateinfo', templet: stateinfo, width: '7%' }
  113. ]], limit: 1000, height: '300'
  114. , data: mp3Arr
  115. , done: function (res, curr, count) { //数据渲染完毕的回调
  116. }
  117. });
  118. }
  119.  
  120. //列模板
  121. function stateinfo(obj) {
  122. //获取行数id
  123. var rowid = obj.LAY_INDEX;
  124. var spanid = "mp3Name" + rowid;
  125. var conname = mp3Arr[rowid - 1]["mp3Name"];
  126. var sicon = "";//""
  127. var iconcolor = "#808080";//灰色 #FF0000 红色
  128. var onmouse = "";
  129.  
  130. if (mp3Arr[rowid - 1]["mp3state"] == 1) {
  131. sicon = "";
  132. //iconcolor = "#FF0000";
  133. onmouse = 'onmouseover = "overshow(this)" onmouseout = "overhiden(this)"';
  134. }
  135. /* return '<span id=' + spanid + '>' + conname + '</span><a name="' + rowid + '" href="#" class="addtnote" onclick="emptydata(2,' + rowid + ')" style="color:' + iconcolor + '"><i class="us-icon" ' + onmouse + '>' + sicon + '</i></a>';*/
  136. //var onmouse = 'onmouseover = "overshow(this)" onmouseout = "overhiden(this)"';
  137. return '<a name="' + rowid + '" href="#" class="addtnote" onclick="emptydata(2,' + rowid + ')" style="color:' + iconcolor + '"><i class="us-icon" ' + onmouse + '>' + sicon + '</i></a>';
  138. }
  139.  
  140. /**
  141. * 进度条
  142. * @param {any} d
  143. */
  144. function schedule(d) {
  145. d.filter == undefined ? d.filter = d.Index : d.filter;
  146. d.progress == undefined ? d.progress = 100 : d.progress;
  147. var color = 'layui-bg-green';
  148. if (d.progress > 50 && d.progress <= 100) {
  149. color = 'layui-bg-green'
  150. } else if (d.progress > 20 && d <= 50) {
  151. color = 'layui-bg-orange'
  152. }
  153. //设置页面进度条
  154. return '<div class="layui-progress layui-progress-big" lay-showpercent="true" id="' + d.filter + '" lay-filter="progress' + d.filter + '">' +
  155. '<div class="layui-progress-bar ' + color + '" lay-percent="' + d.progress + '%">' +
  156. '</div></div>'
  157. }
  158.  
  159. /**
  160. * 设置页面进度条百分比
  161. * @param {any} div 进度条div
  162. * @param {any} val 值
  163. */
  164. function setprogress(div, val) {
  165. element.progress(div, val + '%') //设置页面进度条
  166. }
  167.  
  168. /**
  169. *点击上传前判断
  170. * */
  171. function upInfo() {
  172. if (mp3Arr.length <= 0) {
  173. usbasic.warnMsg("请选择上传媒体文件!");
  174. }
  175. }
  176.  
  177. /**清除媒体
  178. * t 1清空 2单个清除
  179. * r 指定清空媒体的行index
  180. */
  181. function emptydata(t, r) {
  182. //清空
  183. if (t == 1) {
  184. if (mp3Arr.length <= 0) {
  185. return;
  186. }
  187. for (var i = 0; i < mp3Arr.length; i++) {
  188. //清空上传队列中对应的文件
  189. var index = mp3Arr[i]["Index"];
  190. delete files[index];
  191. }
  192. mp3Arr = new Array();
  193. }
  194. //单个清除
  195. if (t == 2) {
  196. //删除上传队列中对应的文件
  197. var index = mp3Arr[r - 1]["Index"];
  198. delete files[index];
  199. //获取对应下标进行数组删除
  200. let getLocation = mp3Arr.indexOf(mp3Arr[r - 1]);
  201. mp3Arr.splice(getLocation, 1);
  202. }
  203. showChoose();
  204. //已经上传成功的进度条设置为100
  205. for (var i = 0; i < mp3Arr.length; i++) {
  206. if (mp3Arr[i].mp3state != 0) {
  207. setprogress("progress" + mp3Arr[i].filter, 100);
  208. }
  209. }
  210. }
  211.  
  212. /**i标签html样式
  213. * thisi i标签对象
  214. */
  215. function overshow(thisi) {
  216. thisi.innerHTML = "";
  217. }
  218.  
  219. /**i标签html样式
  220. *thisi i标签对象
  221. */
  222. function overhiden(thisi) {
  223. thisi.innerHTML = "";
  224. }

Js

自感觉当前显示效果是有点奇怪:

1、多个媒体同时上传时,多个进度条是同时显示进度的(不知道这是不是正常的)

问题解决一:

一、进度条无法显示进度百分比

解决: 缺少element.render()

  1. /**
  2. * 设置页面进度条百分比
  3. * @param {any} div 进度条div
  4. * @param {any} val 进度值
  5. */
  6. function setprogress(div, val) {
  7. element.progress("progress" + div, val + '%'); //设置页面进度条
  8. //设置进度条百分比文本
  9. $("#" + div + "").attr("lay-percent", val + '%');
  10. element.render();
  11. }

二、上传文件进行分片操作:

目的:

项目对上传文件有大小限制,所以当上传的文件(一个文件)大于设置的上传大小上限时,则对其文件进行分片(剪切),控制器对这些片进行整合然后存储  (这种情况只是说一个文件和设置的上限对比,假如:多个文件上传情况,每个文件都很小,但是加起来大于上限也不会分片,只是单个文件与上限相比较情况)

效果图: 界面也进行了优化,进度条有百分比

上传媒体文件--添加显示进度条 layui的upload控件的更多相关文章

  1. 百度开源上传组件webuploader 可上传多文件并带有进度条

    //上传多文件 function UploadMultiFile() { var uploader = WebUploader.create({ // 选完文件后,是否自动上传. auto: true ...

  2. idhttp post 上传或下载时显示进度条

    通过 idhttp 带进度条上传演示一下,下载和上传原理差不多,说明一下下面例子中的的idhttp 是动态创建的 第一步:添加一个StatusBar或者gauge 进度条,这2个都可以.我用的是 st ...

  3. idhttp post 上传或下载时显示进度条(对接idhttp1.OnWork事件)

    通过 idhttp 带进度条上传演示一下,下载和上传原理差不多,说明一下下面例子中的的idhttp 是动态创建的 第一步:添加一个StatusBar或者gauge 进度条,这2个都可以.我用的是 st ...

  4. 解决WordPress无法上传媒体文件以及无法下载和安装主题与插件的问题

    前言: 我的个人博客网站荒原之梦在安装成功WordPress之后本来是可以上传媒体文件,安装主题和插件的,但是后来不知道怎么回事就出了问题:不能上传媒体文件也不能安装主题和插件了.出现这个问题后我尝试 ...

  5. C# WinFrom 导入Excel文件,显示进度条

    因为WINForm程序是在64位上运行如果使用另外一种快速的读取Excel的方法会报“未在本地计算机上注册“Microsoft.Jet.OLEDB.12.0”提供程序” 所以我就换了现在这种读取有点慢 ...

  6. ajax 上传文件,显示进度条,进度条100%,进度条隐藏,出现卡顿就隐藏进度条,显示正在加载,再显示上传完成

    <form id="uploadForm" method="post" enctype="multipart/form-data"&g ...

  7. 使用libcurl开源库和Duilib做的下载文件并显示进度条的小工具

    转载:http://blog.csdn.net/mfcing/article/details/43603525 转载:http://blog.csdn.net/infoworld/article/de ...

  8. C# Winform下载文件并显示进度条

    private void btnDown_Click(object sender, EventArgs e) { DownloadFile("http://localhost:1928/We ...

  9. Winform下载文件并显示进度条

    本来是要研究怎样判断下载完成,结果找到这个方法,可以在这个方法完成之后提示下载完成. 代码如下: using System; using System.Collections.Generic; usi ...

  10. 通过HttpUrlConnection下载文件并显示进度条

    实现效果: 核心下载块: int count = 0; URL url = new URL("http://hezuo.downxunlei.com/xunlei_hezuo/thunder ...

随机推荐

  1. codeforce B. Creating the Contest

    http://codeforces.com/contest/1029/problem/B 水题真快乐= = 1 public class Main { 2 public static void mai ...

  2. python requests库从接口get数据报错Max retries exceeded with url解决方式记录

    问题: session = HTMLSession() r: requests_html.HTMLResponse r = session.get(url=req["url"], ...

  3. css实现一个冰墩墩

    一墩难求,花了一两个小时自己画了一个,HTML结构很简单,CSS上主要就是将各个位置定位,肚子上的logo就只有发挥啦 以下是HTML代码 <div class="container& ...

  4. Java面向对象之接口的定义与实现

    接口 普通类:只有具体实现 抽象类:具体实现和规范(抽象方法)都有! 接口:只有规范!自己无法写方法.专业的约束!约束和实现分离:面向接口编程 接口就是规范,定义的是一组规则,体现了现实世界中&quo ...

  5. Swift async await 使用介绍

    // // ViewController.swift // AsynWait // // Created by shengjie on 2022/2/9. // import UIKit class ...

  6. Centos7忘记root密码,修改root密码及其他用户密码

    具体步骤: 1.重启系统,在开机过程中,快速按下方向键↑和↓.在引导程序页面暂停. 2.选择第一行(背景高亮即为选中),按下键盘上的e,进入编辑模式 3.将光标一直移动到 LANG=en_US.UTF ...

  7. js中各种导出和导入

        exports和module exports的区别: exports是module exports的地址引用 export和export default的区别: export和export d ...

  8. 使用NSIS打包软件

    平台和所需软件 平台: Windows 使用软件: NSIS https://nsis.sourceforge.io/Download HM NIS Edit https://sourceforge. ...

  9. 流程图draw.io自选中文字体

    draw.io免费好用,完全可以取代Visio. 唯独缺省选择都是英文字体.但要选择中文字体也可以自行添加,步骤: 确保系统里已经安装了相应中文字体.ubuntu下Google思源字体在/usr/sh ...

  10. Excel如何按名字提取另一张表上数据(跨表查询)

    1.Excel如何按名字提取另一张表上数据(跨表查询) 公式"=VLOOKUP(A3,[工资信息.xls]Sheet1!$A$3:$B$32,2,0)"原理. 1."A3 ...