大文件上传解决方案
Posted 站在西瓜上的猪
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了大文件上传解决方案相关的知识,希望对你有一定的参考价值。
代码:javascript
1 /** 2 * 骆武辉 3 */ 4 var videoUrl; 5 $(function() { 6 var fileSeed = new Array();// 保存分片表单 7 var loser= new Array();// 保存上传失败文件 8 var Interval;// 重复事件监听参数 9 var uploadState=true;// 分片表单使用状态 10 var fileName; 11 var sizeNum; 12 13 $("#upinput").change(function() { 14 $(".progress").show(); 15 console.info(this); 16 // 获取文件流 17 var file1 = this.files[0]; 18 if(file1.type=="video/mp4"){ 19 20 21 console.info(file1); 22 // 获取文件名 23 fileName = file1.name; 24 25 // 获取文件大小 26 sizeNum = file1.size; 27 // console.info(sizeNum); 28 // console.info(postfix); 29 // 后缀判断 30 var shardSize = 4*1024 * 1024; // 以1MB为一个分片 31 var shardCount = Math.ceil(sizeNum / shardSize); // 总片数 32 // console.info(shardCount); 33 // 文件切片 34 var index = 0; 35 Interval = setInterval(function() { 36 // console.info("正在分片..." + index); 37 // 计算每一片的起始与结束位置 38 var start = index * shardSize, 39 end = Math.min(sizeNum, start + shardSize); 40 // 构造一个表单,FormData是html5新增的 41 var form = new FormData(); 42 form.append("data", file1.slice(start, end)); // slice方法用于切出文件的一部分 43 form.append("name", index+"_"+fileName ); 44 // 保存到数组 45 fileSeed[index] = form; 46 progress(shardCount, index); 47 // console.log("表单" + fileSeed[index]); 48 index++; 49 console.log(index == shardCount); 50 if(index == shardCount) { 51 // 停止重复事件 52 clearInterval(Interval); 53 progress(shardCount, shardCount); 54 } 55 }, 5); 56 }else $(this).attr("value",null); 57 }); 58 59 function progress(shardCount, i) { 60 var num = i / shardCount * 100; 61 // 修改长度 62 $(".progress-seed").css("width", num + "%"); 63 } 64 65 66 function progress(shardCount, i) { 67 var num = i / shardCount * 100; 68 console.info(num); 69 // 修改长度 70 $(".progress-seed").css("width", num + "%"); 71 } 72 73 function combineVoid(index) {// 合并请求 74 // Ajax提交 75 $.ajax({ 76 url: "/video/combineVoid", 77 type: "POST", 78 scriptCharset: ‘utf-8‘, 79 data:{ 80 "fileName":fileName, 81 "fileSzie":sizeNum, 82 "index":index 83 }, 84 success: function(data) { 85 // alert(data); 86 // 成功后的事件 87 if(data!="false") 88 videoUrl=data; 89 else 90 alert("验证失败"); 91 } 92 }); 93 } 94 function uploadAjax(filePiece){ 95 uploadState=false; 96 // Ajax提交 97 $.ajax({ 98 url: "/video/upload", 99 type: "POST", 100 resetFomr: true, 101 data:filePiece , 102 async: false, // 同步减请浏览器负担 103 processData: false, // jquery不要对form进行处理 104 contentType: false, // 指定为false才能形成正确的Content-Type 105 success: function(data) { 106 // 成功后的事件 107 if (data=="false") {// 上传失败标记 108 console.info("上传期间出现错误"); 109 loser[loser.length]=filePiece; 110 } 111 uploadState=true; 112 } 113 }); 114 } 115 116 // 监听ctlBtn 117 $("#ctlBtn").click(function() { 118 if(fileName!=null && fileName!=""){ 119 120 121 var index=0; 122 $(".right840").empty(); 123 $(".right840").load("/html/user_upload2.html"); 124 // 定时执行 125 Interval= setInterval(function() { 126 if(uploadState){ 127 // 加入上传列队 128 uploadAjax(fileSeed[index]); 129 index++; 130 } 131 if(index==fileSeed.length){ 132 clearInterval(Interval); 133 // 校验提醒 134 combineVoid(index); 135 alert("上传完成"); 136 } 137 },50); 138 } 139 }); 140 });
代码:java
public static boolean uploadFile(MultipartFile data, String name) { // TODO Auto-generated method stub boolean falg = false; // 设置保存位置 String realPath = "F:\\cache"; // 创建文件 File targetFile = new File(realPath, name); if (!targetFile.exists()) { targetFile.mkdirs(); } try { // 保存文件流 data.transferTo(targetFile); falg = true; } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return falg; } /** * 文件合并工具 * @param fileName * @param index * @return */ public static String fileCombinePlant(String fileName, Integer index, Integer fileSzie) { String result; // TODO Auto-generated method stub int byteSzie = 100 * 1024; int nextInt = new Random().nextInt(10000); OutputStream out = null; BufferedOutputStream outputStream = null; List<File> files = new ArrayList<>(); try { result = nextInt + fileName; // 创建流对象 out = new FileOutputStream("F:\\vide\\vod1\\" + result); outputStream = new BufferedOutputStream(out); // 匹配文件 for (int i = 0; i < index; i++) { // 创建文件对象 File file = new File("F:\\cache\\" + i + "_" + fileName); files.add(file); InputStream intpu = new FileInputStream(file); // 读取文件到流 byte[] b = new byte[byteSzie]; int read = 0; try { // 读取数据 while ((read = intpu.read(b, 0, b.length)) > 0) { // 输出数据 outputStream.write(b, 0, read); } // 关闭读入流 intpu.close(); } catch (IOException e) { result = "false"; System.out.println("FileUtil-->fileCombinePlant读取流错误"); e.printStackTrace(); } } } catch (FileNotFoundException e) { result = "false"; // TODO Auto-generated catch block System.out.println("FileUtil-->fileCombinePlant输出流错误"); e.printStackTrace(); } finally { try { outputStream.flush(); outputStream.close(); out.flush(); out.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } // 删除缓存文件 removeFile(files); return result; } /** 删除文件 * @param files */ private static void removeFile(List<File> files) { // 遍历集合 for (File file : files) { // 判断文件是否存在 if (file.exists()) { // 删除文件 file.delete(); } } }
以上是关于大文件上传解决方案的主要内容,如果未能解决你的问题,请参考以下文章