真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

springboot中怎么實(shí)現(xiàn)切割分片上傳功能

本篇文章為大家展示了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)添加依賴

  commons-fileupload   commons-fileupload   1.3.3

(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 {  private int code;  private String message;  private T data;  public Result setCode(Integer code) {    this.code = code;    return this;  }  public int getCode() {    return code;  }  public String getMessage() {    return message;  }  public Result setMessage(String message) {    this.message = message;    return this;  }  public T getData() {    return data;  }  public Result setData(T data) {    this.data = data;    return this;  }  @Override  public String toString() {    return JSON.toJSONString(this);  }  public static Result fail(Integer code,T data) {    Result ret = new Result();    ret.setCode(code);    ret.setData(data);    return ret;  }  public static Result failMessage(Integer code,String msg) {    Result ret = new Result();    ret.setCode(code);    ret.setMessage(msg);    return ret;  }  public static Result successMessage(Integer code,String msg) {    Result ret = new Result();    ret.setCode(code);    ret.setMessage(msg);    return ret;  }  public static Result success(Integer code,T data) {    Result ret = new Result();    ret.setCode(code);    ret.setData(data);    return ret;  }}

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è)資訊頻道。


當(dāng)前名稱:springboot中怎么實(shí)現(xiàn)切割分片上傳功能
網(wǎng)頁(yè)路徑:http://weahome.cn/article/pcecjo.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部