更新时间:2020-07-15 20:52:00
更新说明:修复某些问题,改进布局
更新时间:2019/7/25 上午11:02:11
更新说明:统一tips层格式,否则由于格式未统一,控制台可能会显示top.layer is not a function
发布时间:2019-07-22 09:42:03
在本地测试时候,火狐上传图标会显示错误,因为cors没有设置Access-Control-Allow-Origin,控制台出现 已拦截跨源请求:同源策略禁止读取位于
file:///C:/Users/wang/Desktop/upload/layui/font/iconfont.woff?v=240 的远程资源。
(原因:CORS 请求不是 http)。 ie,谷歌无此问题
但是我在html头部加
<meta http-equiv="Access-Control-Allow-Origin" content="*">
并未有效果,希望知道的大佬在评论区回复。
这个问题在真实生产环境中无此问题 这个问题在真实生产环境中无此问题 这个问题在真实生产环境中无此问题
重要的话说三遍,因为真实环境是http请求
此函数对上传进度进行实时监控
//创建监听函数
var xhrOnProgress = function(fun) {
xhrOnProgress.onprogress = fun; //绑定监听
//使用闭包实现监听绑
return function() {
//通过$.ajaxSettings.xhr();获得XMLHttpRequest对象
var xhr = $.ajaxSettings.xhr();
//判断监听函数是否为函数
if (typeof xhrOnProgress.onprogress !== 'function')
return xhr;
//如果有监听函数并且xhr对象支持绑定时就把监听函数绑定上去
if (xhrOnProgress.onprogress && xhr.upload) {
xhr.upload.onprogress = xhrOnProgress.onprogress;
}
return xhr;
}
}js里面写的实例是单图片的上传 关于多文件的相关内容已被注释说明,请根据个人需要调试
js里面的url必须为后台真实上传接口,方可进行测试
此组件支持ie8/ie9,但是大多数参数并不支持,所以推荐ie10及以上
elem: '#upload', //绑定元素
url: 'api/upload', //上传接口
exts: 'jpg|png|jpeg', //限定上传类型
//accept: images,//指定允许上传时校验的文件类型 images(图片)、file(所有文件)、video(视频)、audio(音频)
acceptMime: 'image/jpg, image/png, image/jpeg', //只筛选上述类型图片
//number: '0',//0为不限制上传数量
xhr: xhrOnProgress,
//data: {}, //可选项 额外的参数,如:{id: 123, abc: 'xxx'}
//multiple: true,// 开启多文件上传
//drag:true, //是否允许拖拽上传
size: 1024 * 3, //为0为不限制大小
//监听xhr进度,并返回给进度条
progress: function(value) { //上传进度回调 value进度值
element.progress('upload_progress', value + '%') //设置页面进度条
},
before: function(obj) {
//开始上传时候让进度条去除隐藏状态
$("#upload_progress").removeClass("layui-hide");
//或者设置loading
//top.layer.load(1); //去除方法为 top.layer.close('loading'); 或者 top.layer.closeAll('loading');
},
//auto: false, //选择文件后不自动上传 默认值为true
//bindAction: '#testListAction', //指向一个按钮触发上传........具体请查看js
另外因为为了支持实时进度条,更改了layui的js源码,所以不要替换该文件的layui
upload.js报错
VM4061 upload.js:5 Uncaught ReferenceError: layui is not defined;
需要
$.getScript('https://www.layuicdn.com/layui/layui.js',function(){从新加载一下才可以,有没有同问的,这个怎么解决呢
传统的 会刷新页面
<form id= "uploadForm" action= "XXXX" method= "post" enctype ="multipart/form-data"> <input type="file" name="file"> <input type ="submit" value="上传"/> </form>
至于ajax这个就可以,不会刷新页面
这是我在演示上点网络截取的部分信息 不知道是不是你要的那样
accept: application/json, text/javascript, */*; q=0.01 accept-encoding: gzip, deflate, br accept-language: zh-CN,zh;q=0.9 content-length: 82261 content-type: multipart/form-data; boundary=----WebKitFormBoundaryB30Ar7AE4AP3Z8RB Form Data(file: (binary)): ------WebKitFormBoundaryB30Ar7AE4AP3Z8RB Content-Disposition: form-data; name="file"; filename="downfile2.torrent" Content-Type: application/octet-stream ------WebKitFormBoundaryB30Ar7AE4AP3Z8RB--
你可以在演示上传,F12选网络看下请求头和Request 参数是不是你要的
如果你需要表单和文件一同上传的话,设定为暂不上传,然后把上传按钮绑定为你的表单提交按钮就可以实现
至于后端处理
java演示:
public String uploadProgramme(MultipartFile file) {
...
File files = new File(realPath);
//判断file是否存在,如果不存在,自动创建
if (!files.exists()) {
files.mkdirs();
}
...
//利用文件读写将本地文件读写到服务器
try {
file.transferTo(files);
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
...
}
支持断点续传的一般是C/S,B/S是没办法支持断点续传的,如果是很大的文件或者视频文件的话,建议您选择其他插件,大文件上传的话一般使用并发分片上传的模式,flash文件流也可以,这样的话即使上传失败也不会重新上传整个文件,而且文件体积大、量比较多,上传的话还应该考虑md5校验,Web前端可使用百度的 webuploader H5大文件分片上传插件;
官网地址:
http://fex.baidu.com/webuploader/
WebUploader是由Baidu WebFE(FEX)团队开发的一个简单的以HTML5为主,FLASH为辅的现代文件上传组件。在现代的浏览器里面能充分发挥HTML5的优势,同时又不摒弃主流IE浏览器,沿用原来的FLASH运行时,兼容IE6+,iOS 6+, android 4+。两套运行时,同样的调用方式,可供用户任意选用。采用大文件分片并发上传,极大的提高了文件上传效率。
分片与并发结合,将一个大文件分割成多块,并发上传,极大地提高大文件的上传速度。
当网络问题导致传输错误时,只需要重传出错分片,而不是整个文件。另外分片传输能够更加实时的跟踪上传进度。(摘自WebUploader官网)