使用webuploader上传大文件
遇到一个需求,用户想上传超过1、2G的视频文件。
根据这个需求做了一些上传速度对比,ftp上传1G多点的文件用时三分钟左右
1.使用ftp上传
/*** 上传文件* * @param hostname* FTP服务器地址* @param port* FTP服务器端口号* @param username* FTP登录帐号* @param password* FTP登录密码* @param pathname* FTP服务器保存目录* @param fileName* 上传到FTP服务器后的文件名称* @param inputStream* 输入文件流* @return*/public static boolean uploadFile(String hostname, int port,String username, String password, String pathname, String fileName,InputStream inputStream) {boolean flag = false;long startTime=System.currentTimeMillis();FTPClient ftpClient = new FTPClient();ftpClient.setControlEncoding("UTF-8");try {// 连接FTP服务器ftpClient.connect(hostname, port);// 登录FTP服务器ftpClient.login(username, password);// 是否成功登录FTP服务器int replyCode = ftpClient.getReplyCode();if (!FTPReply.isPositiveCompletion(replyCode)) {return flag;}//ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);ftpClient.makeDirectory(pathname);ftpClient.changeWorkingDirectory(pathname);ftpClient.storeFile(fileName, inputStream);inputStream.close();ftpClient.logout();flag = true;} catch (Exception e) {e.printStackTrace();} finally {if (ftpClient.isConnected()) {try {ftpClient.disconnect();} catch (IOException e) {e.printStackTrace();}}}long endTime=System.currentTimeMillis();float excTime=(float)(endTime-startTime)/1000;System.out.println("执行时间:"+excTime+"s");return flag;}
2.使用webuploader上传,集成了进度条.
(1)前端页面
<link rel="stylesheet" type="text/css" href="js/webuploader/webuploader.css" /><link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css"><link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.5.0/css/font-awesome.min.css"><link rel="stylesheet" type="text/css" href="js/webuploader/style.css" />
<input type="hidden" id="fileUrl" name="news.fileUrl"><div id="uploader" class="wu-example"><div class="btns"><div id="attach"></div><div id="thelist" class="uploader-list"></div><a id="upload" href="javascript:void(0)" class="easyui-linkbutton">上传文件</a></div></div><script type="text/javascript" src="js/webuploader/webuploader.js"></script><script type="text/javascript" src="js/webuploader/upload.js"></script><div style="text-align:center;clear:both;"><script src="js/other/gg_bd_ad_720x90.js" type="text/javascript"></script><script src="js/other/follow.js" type="text/javascript"></script></div>
(2)进度条样式文件
body{
background: #a8b1b6;
color: #2fa0ec;
font-weight: 500;
font-size: 1.05em;
font-family: "Microsoft YaHei","宋体","Segoe UI", "Lucida Grande", Helvetica, Arial,sans-serif, FreeSans, Arimo;
}
a{color: #d8dedc;outline: none;}
a:hover,a:focus{color:#74777b;text-decoration: none;}
.progress{
height: 30px;
line-height: 35px;
background: #809495;
box-shadow: none;
padding: 6px;
margin-top:20px;
overflow: visible;
border-radius:10px;
}
.progress:after{
content: "";
display: block;
border-top: 4px dashed #fff;
margin-top:8px;
}
.progressbar-title{
color:#d8dedc;
font-size:15px;
margin:5px 0;
font-weight: bold;
}
.progress .progress-bar{
position: relative;
border-radius: 10px 0 0 10px;
animation: animate-positive 2s;
}
.progress .progress-bar span{
position: absolute;
top: -50px;
right: -40px;
color: #fff;
display: block;
font-size: 17px;
font-weight: bold;
padding: 5px 7px;
background: #333;
border-radius: 0 0 5px 5px;
}
.progress .progress-bar span:before{
content: "";
position: absolute;
bottom: -14px;
left: 18px;
border: 7px solid transparent;
border-top: 7px solid #333;
}
.progress .progress-bar span:after{
content: "\f072";
font-family: fontawesome;
font-size: 48px;
color: #333;
position: absolute;
top: 51px;
right: 6px;
transform: rotateZ(48deg);
}
@-webkit-keyframes animate-positive {
0% { width: 0%;}
}
@keyframes animate-positive {
0% { width:0%; }
}
(3) 上传文件 upload.js
/**
* *******************************WebUpload 单文件上传begin****************************************
*/
_extensions ='3gp,mp4,rmvb,mov,avi,m4v,mkv';
_mimeTypes ='video/*,audio/*,application/*';
$(function() {
var $list = $("#thelist");
var uploader;// 实例化
uploader = WebUploader.create( {
auto : false, // 是否自动上传
pick : {
id : '#attach',
name : "file", // 这个地方 name
// 没什么用,虽然打开调试器,input的名字确实改过来了。但是提交到后台取不到文件。如果想自定义file的name属性,还是要和fileVal
// 配合使用。
label : '点击选择文件',
multiple : false
// 默认为true,就是可以多选
},
swf : 'js/webuploader/Uploader.swf',
// fileVal:'multiFile', //自定义file的name属性,我用的版本是0.1.5 ,打开客户端调试器发现生成的input
// 的name 没改过来。
// 名字还是默认的file,但不是没用哦。虽然客户端名字没改变,但是提交到到后台,是要用multiFile 这个对象来取文件的,用file
// 是取不到文件的
server : "videoAction!ajaxAttachUpload.action",
duplicate : true,// 是否可重复选择同一文件
resize : false,
formData : {
"status" : "file",
"contentsDto.contentsId" : "0000004730",
"uploadNum" : "0000004730",
"existFlg" : 'false'
},
compress : null,
chunked : true, // 分片处理
chunkSize : 50 * 1024 * 1024, // 每片50M,经过测试,发现上传1G左右的视频大概每片50M速度比较快的,太大或者太小都对上传效率有影响
chunkRetry : false,// 如果失败,则不重试
threads : 1,// 上传并发数。允许同时最大上传进程数。
// runtimeOrder: 'flash',
disableGlobalDnd : true,
accept: {
title: '视频文件上传', //文字描述
extensions: _extensions, //允许的文件后缀,不带点,多个用逗号分割。,jpg,png,
mimeTypes: _mimeTypes, //多个用逗号分割。,
}
});
// 当有文件添加进来的时候
uploader.on("fileQueued", function(file) {
console.log("fileQueued:");
$list.html("
" + "
" + file.name + "
" + "
等待上传...
" + "
"); }); // 当所有文件上传结束时触发 uploader.on("uploadFinished", function() { console.log("uploadFinished:"); }); // 当某个文件上传到服务端响应后,会派送此事件来询问服务端响应是否有效。 uploader.on("uploadAccept", function(object, ret) { // 服务器响应了 var data = JSON.parse(ret._raw); if (data.isSuccess == "1" || data.isSuccess == "3") { $("#fileUrl").val(data.fileUrl); } else { uploader.reset(); alert("上传文件出现异常,请刷新后重新尝试。"); return false; } }); uploader.on('uploadProgress', function (file, percentage) {//进度条事件 var $li = $list.find('#' + file.id), $percent = $li.find('#ProcessWD'); // 避免重复创建 if (!$percent.length) { $percent = $('
上传进度
' + '
' + '' + '
').appendTo($li).find('.progress-bar'); } $("#" + file.id).find("p.state").text('正在上传'); $("#fileProcess").text(Math.round(percentage * 100) + '%'); $("#ProcessWD").css('width', percentage * 100 + '%'); }); // 当文件上传成功时触发。 uploader.on("uploadSuccess", function(file) { $("#" + file.id).find("p.state").text("已上传成功"); }); uploader.on("uploadError", function(file) { $("#" + file.id).find("p.state").attr("color","red"); $("#" + file.id).find("p.state").text("上传出错"); uploader.cancelFile(file); uploader.removeFile(file, true); uploader.reset(); }); /** * 验证文件格式以及文件大小 */ uploader.on("error",function (type,handler){ if (type=="Q_TYPE_DENIED"){ $.messager.alert('提示窗口','请上传MP4格式的视频!'); } }); $("#upload").on("click", function() { $("#showJD").attr("display","block"); $('#upload').linkbutton('disable'); uploader.upload(); }) });
(4) 后台上传处理
//视频文件上传private File file;private String fileFileName;//属性值,接收webupload自带的参数private String chunk; // 当前第几个分片private String chunks;// 总分片个数private String size;// 单个文件的总大小 ....../*** 文件上传保存* @return*/public String ajaxAttachUpload() {Map<String, Object> map = new HashMap<String, Object>();try {String fileUrl = CommonConstants.UPLOAD_VIDEO +fileFileName;fileUrl = fileUrl.replace("\\", "/");FileUtil.randomAccessFile(fileUrl,file);if(EmptyUtils.isEmptyString(chunk)){map.put("isSuccess", 1);//不分片的情况}else{if (Integer.valueOf(chunk) == (Integer.valueOf(chunks) - 1)) {//分片的情况map.put("isSuccess", 1);} else {map.put("isSuccess", 3);}}map.put("fileUrl", saveDir);} catch (Exception e) {map.put("isSuccess", 2);}request.setAttribute("records", JSONObject.fromObject(map));return "back";}.......
/*** 指定位置开始写入文件* @param tempFile 输入文件* @param outPath 输出文件的路径(路径+文件名)* @throws IOException*/public static void randomAccessFile(String outPath,File tempFile) throws IOException{RandomAccessFile raFile = null;BufferedInputStream inputStream=null;try{File dirFile = new File(outPath);File parentDir = dirFile.getParentFile();if (!parentDir.exists()) {FileUtils.forceMkdir(parentDir);}//以读写的方式打开目标文件raFile = new RandomAccessFile(dirFile, "rw"); raFile.seek(raFile.length());inputStream = new BufferedInputStream(new FileInputStream(tempFile));byte[] buf = new byte[1024];int length = 0;while ((length = inputStream.read(buf)) != -1) {raFile.write(buf, 0, length);}}catch(Exception e){e.printStackTrace();throw new IOException(e.getMessage());}finally{try {if (inputStream != null) {inputStream.close();}if (raFile != null) {raFile.close();}}catch(Exception e){throw new IOException(e.getMessage());}}}
(5)视频查看
<video width="75%" controls="controls" autoplay="autoplay"><source src="${pageContext.request.contextPath}/${n.fileUrl}" type="video/ogg" /><source src="${pageContext.request.contextPath}/${n.fileUrl}" type="video/mp4" />您的浏览器不支持此种视频格式。</video>
使用ftp上传大文件太慢了,最后选择了百度的webuploader,测试下来效果还不错。
以上
使用webuploader上传大文件相关推荐
- php webuploader大文件,web uploader 上传大文件总结
由于业务需要,需要上传大文件,已有的版本无法处理IE版本,经过调研,百度的 webuploader 支持 IE 浏览器,而且支持计算MD5值,进而可以实现秒传的功能. 大文件上传主要分为三部分,预上传 ...
- 用ASP.NET上传大文件
作者:思归 微软MVP http://blog.joycode.com/saucer/ 我们在上传大文件时都遇到过这样或那样的问题.设置很大的maxRequestLength值并不能完全解 ...
- html5 上传超大文件,HTML5教程 如何拖拽上传大文件
本篇教程探讨了HTML5教程 如何拖拽上传大文件,希望阅读本篇文章以后大家有所收获,帮助大家HTML5+CSS3从入门到精通 . < 前言: 大文件传输一直是技术上的一大难点.文件过大时,一些性 ...
- php上传图片k,PHP fastcgi模式上传大文件(大约有300多K)报错,
PHP fastcgi模式上传大文件(大约有300多K)报错, 最近在项目中中上传图片时,大约有300多K,结果报了个服务器错误,以前从未遇到过,错误的内容如下: mod_fcgid: HTTP re ...
- asp.net core mvc上传大文件解决方案
asp.net core mvc上传大文件解决方案 参考文章: (1)asp.net core mvc上传大文件解决方案 (2)https://www.cnblogs.com/eggtwo/p/988 ...
- php 上传大文件涉及的配置,upload_max_filesize,post_max_size
php.ini配置文件中的默认文件上传大小为2M, 默认upload_max_filesize = 2M,即文件上传的大小为2M,如果你想上传超过8M的文件,比如20M,你必须设定upload_max ...
- php 超过100m文件上传,科技常识:apache+php上传大文件以上传100M为例
科技常识:apache+php上传大文件以上传100M为例 2021-03-19 18:54:57 今天小编跟大家讲解下有关apache+php上传大文件以上传100M为例 ,相信小伙伴们对这个话题应 ...
- asp.net 上传大文件解决方案(转)
这次在项目中,用到了大文件上传,要上传的文件有100多m,于是研究现在国内使用的大文件上传的 组件发现用的比较多的有两个控件AspnetUpload 2.0和Lion.Web.UpLoadModule ...
- 华为云服务器 大文件,云服务器上传大文件
云服务器上传大文件 内容精选 换一换 本节操作介绍本地MacOS系统主机通过安装"Microsoft Remote Desktop for Mac"工具向Windows云服务器传输 ...
最新文章
- 5G时代来临,高通如何让AI触手可及?
- php 管理服务器内存,解决PHP-FPM进程导致的服务器内存占用
- MVC系列——一个异常消息传递引发的思考
- 控件View动态设置高度时会卡顿、速度慢的情况解决
- 可以给img元素设置背景图
- SAP ABAP一组关键字 IS BOUND, IS NOT INITIAL和IS ASSIGNED的用法辨析
- ios之第一个程序Hello word, I am chenyu !
- 力荐!计算机视觉开源工具中的瑞士军刀—Dlib最新高级特性教程
- gem install 和 bundle 区别
- 01-复杂度1 最大子列和问题(剑指offer和PAT)
- 建设可信赖、公平开放的HMS生态,华为与全球伙伴合作共赢
- 数据库访问技术(二)---ADO.NET
- 数据结构上机实践第四周项目1 - 建立单链表
- 类的说明补充,对象的学习
- 领域平均滤波 matlab,平均值滤波器
- MATLAB Simulink
- MathWorks 中国
- 聚类算法之K均值算法C++实现
- arduino定时器控制舵机_Arduino通过串口控制舵机角度
- 树莓派实现固定IP地址
- Java核心技术 卷1 基础知识 学习笔记——第三章 java的基本程序设计结构
- DXperience皮肤设置 C#第三方控件学习笔记
热门文章
- jetson nx 刷机之坑
- 【嵌入式】蓝牙串口通信透传模块(HC-08)的使用
- 用爬虫抓取美联储演讲数据并分析金融政策
- Unable to save binary node-sass/vendor/linux-x64-72 : Error: EACCES: permission denied, mkdir
- pyppeteer初次运行需要下载Chrome无法下载的解决方案
- 居家养老服务内容有哪些,居家养老系统大屏展示
- 台电android os耗电,【台电 T10平板电脑使用总结】拍照|流畅度|系统|续航_摘要频道_什么值得买...
- Objective-C入门IOS语法
- 中国电信商务领航:网关(2-1)端口映射
- 2020年最佳英文关键词研究工具!