希望大家指點有哪些地方不足!
Html 代碼
<div id=""> <form class="form-horizontal" enctype="multipart/form-data" id="formImport"> <!-- 單個文件上傳 --> <input type="file" id="xlsFile" name="excelFile" /> </form> </div>
觸發上傳
submitForm(0,1); //由 0 字節開始上傳,命名由第 1 部分開始
js 代碼
function submitForm(begin,part){ var file = $('#xlsFile')[0].files[0]; //console.log(file); const LENGTH = 1024 * 1024 * 10;//每次上傳的大小 var totalSize = file.size; //文件總大小 var start = begin; //每次上傳的開始字節 var end = start + LENGTH; //每次上傳的結尾字節 var blob = null; //二進制對象 blob = file.slice(start,end); //截取每次需要上傳字節數 formData = new FormData(); //每一次需重新創建 formData.append('file',blob); //添加數據到表單對象中 formData.append('fileName',file.name);//上傳文件的名字 formData.append('part',part); //上傳第幾部分 $.ajax({ url: '${path}/exe/doUploadDatas', type: 'POST', cache: false, data: formData, processData: false, contentType: false }).done(function(result){ if(result.code==200){ start = end; // 累計上傳字節數 end = start + LENGTH; // 由上次完成的部分字節開始,添加下次上傳的字節數 part++; // 上傳文件部分累計 if(start>=totalSize){ //如果上傳字節數大於或等於總字節數,結束上傳 alert('上傳完成!'); //告訴后台上傳完成后合並文件 //返回上傳文件的存放路徑 $.post('${path}/exe/mergetFile',{fileName:file.name,path:result.path},function(result){ if(result.code==200){ alert('合並完成!'); } }); }else{ submitForm(start,part); // 上傳字節不等與或大於總字節數,繼續上傳 } } }).fail(function() { }); }
后台使用了spring mvc
@RequestMapping(value = "/doUploadDatas",method = RequestMethod.POST) @ResponseBody //synchronized public Map<String,Object> doSaveImportDatas(@RequestParam("file") MultipartFile file,String fileName,Integer part) throws Exception{ Map<String, Object> map = new HashMap<String, Object>(); try { //創建存放合並文件 根據需求修改 String path = "D:\\新建文件夾\\source\\temp"; File mkdir = new File(path); if (!mkdir.exists()) { mkdir.mkdirs(); } file.transferTo(new File(path+"\\"+fileName+"-"+part)); map.put("code",200); map.put("path",path); } catch (Exception e) { map.put("error",e.getMessage()); } return map; }
上傳完成后的文件是這樣的。
合並文件
@RequestMapping("/mergetFile") @ResponseBody public Map<String,Object> mergetFile(String fileName,String path){ Map<String, Object> map = new HashMap<String, Object>(); try { //合並目標路徑 根據需求修改 合並文件名 合並來源路徑 merge("D:\\新建文件夾\\target\\", fileName, path); map.put("code",200); } catch (Exception e) { map.put("error",e.getMessage()); } return map; }
public static void merge(String targetPath,String targetFileName,String sourcePath) throws IOException{ File file = new File(sourcePath); File[] fileArr = file.listFiles(); String[] arr = new String[fileArr.length]; //這里要注意,要按文件上傳完成順序合並,如果沒有按順序合並。最終的文件是損壞的。 for (int i = 0; i < fileArr.length; i++) { arr[i] = fileArr[i].getPath(); } //根據最后面的部分 按先后順序排序 for (int i = 0; i < arr.length; i++) { for (int j = 0; j < arr.length-1; j++) { if(Integer.parseInt(arr[i].substring(arr[i].lastIndexOf("-"),arr[i].length())) >Integer.parseInt(arr[j].substring(arr[j].lastIndexOf("-"),arr[j].length()))) { String temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } } } File destFile = new File(targetPath+targetFileName);//合並后的文件 InputStream in = null; OutputStream out = new FileOutputStream(destFile); try { byte[] bytes = new byte[1024*1024]; for (String f : arr) { in = new FileInputStream(f); System.out.println(f); int len = -1; while((len = in.read(bytes))!=-1){ out.write(bytes, 0, len); } } in.close(); out.close(); //刪除合並前文件 } catch (FileNotFoundException e) { e.printStackTrace(); } }
轉成集合排序會方便點,但是在別人的電腦上測試會有問題
List<File> files = Arrays.asList(fileArr); files.sort((File f1,File f2)->f1.lastModified()-f2.lastModified()>0?1:-1); //按修改日期排序, 這樣排序會有問題