大文件分割上傳

来源:http://www.cnblogs.com/nmnm/archive/2017/12/14/8038791.html
-Advertisement-
Play Games

希望大家指點有哪些地方不足! 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);    //按修改日期排序, 這樣排序會有問題

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1 #include<stdio.h> 2 struct Student 3 { 4 int num; 5 float score; 6 }a[105]; //定義結構體的類型 7 8 void input(struct Student *a,int n) 9 { 10 int i; 11 for( ...
  • 所謂圖片爬蟲,就是從互聯網中自動把對方伺服器上的圖片爬下來的爬蟲程式。有些圖片是直接在html文件裡面,有些是隱藏在JS文件中,在html文件中只需要我們分析源碼就能得到如果是隱藏在JS文件中,那麼就需要進行抓包分析,這兒先只講分析html源碼得出圖片,註意 這兒我們需要讀取的是高清原圖,不是經過網... ...
  • '''python中有五種數據類型,分別是整數、浮點數、字元串、布爾值、空值'''a = 1b = 2.0c = 'hello,world'print (a,b,c)#a是整數,b是浮點數,c是字元串float(a);print(a)int(b);print(b)str(a);print(a)#以上 ...
  • 轉義字元 通過\來轉變後面字母或者符號的含義\n:換行\b:退格 相當於backspace\r:按下回車鍵 window系統 回車符是由兩個字元來表示\r\n\t:製表符 相當於tab鍵 邏輯運算符 %左邊等於右邊就是0右邊是1結果是0如果出現負數 只看左邊是否負數& 只要兩邊的boolean表達式 ...
  • https://www.cnblogs.com/ggzss/archive/2011/08/18/2145017.html assert是一個巨集定義,其作用是如果它的條件返回錯誤,則終止程式執行,原型定義: assert的作用是現計算表達式 expression ,如果其值為假(即為0),那麼它先向 ...
  • 這裡儘管缺少消息發送所需要的點(.)以及該消息的顯示接收者,卻依然發送了消息puts並傳遞了參數“Hello”給一個對象:預設對象self。在程式運行期間,雖然作為self的對象通過特定規則發生改變,但self總是被預定義好的。 ...
  • UDP 用戶數據報協議,是一個簡單的面向數據報的運輸層協議。UDP不提供可靠性,它只是把應用程式傳給IP層的數據報發送出去,但是並不能保證它們能到達目的地 ,也不能保證數據包到達的順序。由於UDP在傳輸數據報前不用在客戶和伺服器之間建立一個連接,且沒有超時重發等機制,故而傳輸速度很快。 在Java中 ...
  • 如果字元串的行尾沒有包含換行符,puts就會添加一個,但print不會; print會精確列印內容並讓游標留在末尾(在某些系統平臺,在程式輸出的末尾會自動換行); p會輸出一個審查字元串,它通常會包含一些額外的輸出信息。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...