java后端實現接收文件分片+斷點續傳


不得不說SpringBoot太好用了。

要求:

  • 前端傳來文件的名字,切片的長度,切片的序列號,文件切片;
  • 構造一個對象用來接收傳來的數據

img

img

拿到切片后就可以寫文件的合並了,先說以下,前端傳過來的數據是嚴格順序,上一個切片沒有寫入,下一個是不會傳過來的,詳情可以去看我另一篇文章原生JS實現大文件分片 - 知乎 (zhihu.com)

先說一下想法:

  1. 判斷切片的序列號是否為0,如果為零就以name的值為文件名創建文件。
  2. 如果不是序列號不為0就說文件已經存在,提取傳入文件的字節流寫入寫入文件內。
 public void 單片寫入(文件 file) throws IOException {
        File file1 ;

        MultipartFile meFile =file.getFile();// MultipartFile 這個類可以方便的獲取前端傳過來的文件
        file1=new File("C:\\Users\\laptop\\IdeaProjects\\file21510\\src\\main\\resources\\temp\\001\\"+file.getName());
        //filel獲取文件,沒有就創建
        if (!file1.exists()&&file.get切片序列()==0)//文件是否已經創建且文件是第一個保證文件的順須
        {
            meFile.transferTo(file1);//如果沒有就創建
             return;
        }
        else {//如果已經創建就合並
        RandomAccessFile raf = new RandomAccessFile(file1,"rw");
        // RandomAccessFile類所提供的發方法可以動態的操作文件,
       //這里創建一個可以操作不完整文件的對象

            
        raf.seek(file.get切片序列()*file.get切片長度());//seek(int n)從n處處理
            byte[] bytes = meFile.getBytes();//提區文件的字節流
            raf.write(bytes);//上面的seek方法已經把指針放在這里從這直接寫入
              

          raf.close();//寫入后關閉

        }

    }
}

上面就可以實現分片文件的接收合並了,重要的是MultipartFile,RandomAccessFile,這兩個類。

斷點續傳

實現斷點續傳的構思

  1. 文件分片按順序上傳,上傳第一個后文件名md5加密保存到rdis的key,value保存為上傳的切片序列的大小,
  2. 然后下面每次保存成功就更新對應的value,保持最新的。
  3. 每一次接收時查詢redis是否已經存在相同的key,如果相同就跳到保存的index的下一個保存

有了上面的代碼只需要在構造一個連接redis的接口和實現類。

這是我想的,如果有什么錯誤,請大家指出


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM