本篇文章為大家展示了springboot中怎么實(shí)現(xiàn)切割分片上傳功能,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過(guò)這篇文章的詳細(xì)介紹希望你能有所收獲。
在北川羌族等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都網(wǎng)站制作、成都網(wǎng)站建設(shè)、外貿(mào)營(yíng)銷網(wǎng)站建設(shè) 網(wǎng)站設(shè)計(jì)制作按需網(wǎng)站策劃,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),品牌網(wǎng)站建設(shè),營(yíng)銷型網(wǎng)站,成都外貿(mào)網(wǎng)站建設(shè)公司,北川羌族網(wǎng)站建設(shè)費(fèi)用合理。
文件上傳是web開(kāi)發(fā)中經(jīng)常會(huì)遇到的
springboot的默認(rèn)配置為10MB,大于10M的是傳不上服務(wù)器的,需要修改默認(rèn)配置
但是如果修改支持大文件又會(huì)增加服務(wù)器的負(fù)擔(dān)。
當(dāng)文件大于一定程度時(shí),不僅服務(wù)器會(huì)占用大量?jī)?nèi)存,而且http傳輸極可能會(huì)中斷。
可以采用切割分片上傳
html5提供的文件API中可以輕松的對(duì)文件進(jìn)行分割切片,然后通過(guò)ajax異步處理向服務(wù)器傳輸數(shù)據(jù),突破對(duì)大文件上傳的限制,
同時(shí)異步處理在一定程度上也提高了文件上傳的效率。
過(guò)程描述:
將文件分割成N片 處理分片,前臺(tái)會(huì)多次調(diào)用上傳接口,每次都會(huì)上傳文件的一部分到服務(wù)端 N個(gè)分片都上傳完成后,將N個(gè)文件合并為一個(gè)文件,并將N個(gè)分片文件刪除
1.服務(wù)端
(1)添加依賴
(2)UploadController
package com.example.demo.controller;import com.example.demo.core.Result;import org.apache.commons.fileupload.servlet.ServletFileUpload;import org.apache.commons.io.FileUtils;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.CrossOrigin;import org.springframework.web.bind.annotation.PostMapping;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.ResponseBody;import org.springframework.web.multipart.MultipartFile;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.text.SimpleDateFormat;import java.util.Date;@CrossOrigin@Controller@RequestMapping("/api/upload")public class UploadController { @PostMapping("/part") @ResponseBody public Result bigFile(HttpServletRequest request, HttpServletResponse response, String guid, Integer chunk, MultipartFile file, Integer chunks) { try { String projectUrl = System.getProperty("user.dir").replaceAll("\\\\", "/"); ; boolean isMultipart = ServletFileUpload.isMultipartContent(request); if (isMultipart) { if (chunk == null) chunk = 0; // 臨時(shí)目錄用來(lái)存放所有分片文件 String tempFileDir = projectUrl + "/upload/" + guid; File parentFileDir = new File(tempFileDir); if (!parentFileDir.exists()) { parentFileDir.mkdirs(); } // 分片處理時(shí),前臺(tái)會(huì)多次調(diào)用上傳接口,每次都會(huì)上傳文件的一部分到后臺(tái) File tempPartFile = new File(parentFileDir, guid + "_" + chunk + ".part"); FileUtils.copyInputStreamToFile(file.getInputStream(), tempPartFile); } } catch (Exception e) { return Result.failMessage(400,e.getMessage()); } return Result.successMessage(200,"上次成功"); } @RequestMapping("merge") @ResponseBody public Result mergeFile(String guid, String fileName) { // 得到 destTempFile 就是最終的文件 String projectUrl = System.getProperty("user.dir").replaceAll("\\\\", "/"); try { String sname = fileName.substring(fileName.lastIndexOf(".")); //時(shí)間格式化格式 Date currentTime = new Date(); SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMddHHmmssSSS"); //獲取當(dāng)前時(shí)間并作為時(shí)間戳 String timeStamp = simpleDateFormat.format(currentTime); //拼接新的文件名 String newName = timeStamp + sname; simpleDateFormat = new SimpleDateFormat("yyyyMM"); String path = projectUrl + "/upload/"; String tmp = simpleDateFormat.format(currentTime); File parentFileDir = new File(path + guid); if (parentFileDir.isDirectory()) { File destTempFile = new File(path + tmp, newName); if (!destTempFile.exists()) { //先得到文件的上級(jí)目錄,并創(chuàng)建上級(jí)目錄,在創(chuàng)建文件 destTempFile.getParentFile().mkdir(); try { destTempFile.createNewFile(); } catch (IOException e) { e.printStackTrace(); } } for (int i = 0; i < parentFileDir.listFiles().length; i++) { File partFile = new File(parentFileDir, guid + "_" + i + ".part"); FileOutputStream destTempfos = new FileOutputStream(destTempFile, true); //遍歷"所有分片文件"到"最終文件"中 FileUtils.copyFile(partFile, destTempfos); destTempfos.close(); } // 刪除臨時(shí)目錄中的分片文件 FileUtils.deleteDirectory(parentFileDir); return Result.successMessage(200,"合并成功"); }else{ return Result.failMessage(400,"沒(méi)找到目錄"); } } catch (Exception e) { return Result.failMessage(400,e.getMessage()); } }}
說(shuō)明:
注解 @CrossOrigin 解決跨域問(wèn)題
(3)Result
package com.example.demo.core;import com.alibaba.fastjson.JSON;/** * Created by Beibei on 19/02/22 * API響應(yīng)結(jié)果 */public class Result
2.前端
(1)使用插件
webuploader,下載https://github.com/fex-team/webuploader/releases
選擇文件
(2)不使用插件
直接用HTML5的File API
3.優(yōu)化
springboot的默認(rèn)配置為10MB,前端分片改為20M時(shí),就會(huì)報(bào)錯(cuò)
org.apache.tomcat.util.http.fileupload.FileUploadBase$SizeLimitExceededException: the request was rejected because its size (10486839) exceeds the configured maximum (10485760)
解決方法:
在 src/main/resources 下的 application.properties里添加
spring.servlet.multipart.max-file-size=30MBspring.servlet.multipart.max-request-size=35MB
說(shuō)明:
設(shè)置的數(shù)值雖好比前端傳過(guò)來(lái)的大,要不容易報(bào)錯(cuò)
上述內(nèi)容就是springboot中怎么實(shí)現(xiàn)切割分片上傳功能,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。