希望大家指點有哪些地方不足! Html 代碼 觸發上傳 js 代碼 後臺使用了spring mvc 上傳完成後的文件是這樣的。 合併文件 轉成集合排序會方便點,但是在別人的電腦上測試會有問題 ...
希望大家指點有哪些地方不足!
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); //按修改日期排序, 這樣排序會有問題