亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

SpringBoot+fileUpload獲取文件上傳進度

2024-07-14 08:42:10
字體:
來源:轉載
供稿:網友

我本人在網上找了很多關于文件上傳進度獲取的文章,普遍基于spring MVC 框架通過 fileUpload 實現,對于spring Boot 通過 fileUpload 實現的帖子非常少,由于小弟學藝不精,雖然 Spring Boot 和 Spring MVC 相差不大,只是配置方式的差別,還是搞了很久,上傳此文章的目的是希望自己作為文本保留,以便日后查看備忘,并且希望通過我的例子可以幫助到其他人而已,如果各位大佬發現小弟對于某些知識有誤解,還請不吝賜教,先謝謝各位前輩了!

寫此篇文章之前我查了很多關于spring MVC 框架通過 fileUpload 實現進度條的帖子和文章,在此對各位作者表示感謝!

本功能基于commons fileUpload 組件實現

1.首先,不能在程序中直接使用 fileUpload.parseRequest(request)的方式來獲取 request 請求中的 multipartFile 文件對象,原因是因為在 spring 默認的文件上傳處理器 multipartResolver 指向的類CommonsMultipartResolver 中就是通過 commons fileUpload 組件實現的文件獲取,因此,在代碼中再次使用該方法,是獲取不到文件對象的,因為此時的 request 對象是不包含文件的,它已經被CommonsMultipartResolver 類解析處理并轉型。

CommonsMultipartResolver 類中相關源碼片段:

protected MultipartParsingResult parseRequest(HttpServletRequest request) throws MultipartException {    String encoding = determineEncoding(request);    FileUpload fileUpload = prepareFileUpload(encoding);    try {      List<FileItem> fileItems = ((ServletFileUpload) fileUpload).parseRequest(request);      return parseFileItems(fileItems, encoding);    }    catch (FileUploadBase.SizeLimitExceededException ex) {      throw new MaxUploadSizeExceededException(fileUpload.getSizeMax(), ex);    }    catch (FileUploadBase.FileSizeLimitExceededException ex) {      throw new MaxUploadSizeExceededException(fileUpload.getFileSizeMax(), ex);    }    catch (FileUploadException ex) {      throw new MultipartException("Failed to parse multipart servlet request", ex);    }}

2.由于spring 中的 CommonsMultipartResolver 類中并沒有加入 processListener 文件上傳進度監聽器,所以,直接使用 CommonsMultipartResolver 類是無法監聽文件上傳進度的,如果我們需要獲取文件上傳進度,就需要繼承 CommonsMultipartResolver 類并重寫 parseRequest 方法,在此之前,我們需要創建一個實現了 processListener 接口的實現類用于監聽文件上傳進度。

processListener接口實現類:

import javax.servlet.http.HttpSession;import org.apache.commons.fileupload.ProgressListener;import org.springframework.stereotype.Component;@Componentpublic class UploadProgressListener implements ProgressListener{  private HttpSession session;   public void setSession(HttpSession session){     this.session=session;     ProgressEntity status = new ProgressEntity();     session.setAttribute("status", status);   }   /*    * pBytesRead 到目前為止讀取文件的比特數 pContentLength 文件總大小 pItems 目前正在讀取第幾個文件    */   @Override  public void update(long pBytesRead, long pContentLength, int pItems) {     ProgressEntity status = (ProgressEntity) session.getAttribute("status");     status.setpBytesRead(pBytesRead);     status.setpContentLength(pContentLength);     status.setpItems(pItems);   } }

ProgressEntity 實體類:

import org.springframework.stereotype.Component;@Componentpublic class ProgressEntity {   private long pBytesRead = 0L;  //到目前為止讀取文件的比特數    private long pContentLength = 0L;  //文件總大小    private int pItems;        //目前正在讀取第幾個文件   public long getpBytesRead() {     return pBytesRead;   }   public void setpBytesRead(long pBytesRead) {     this.pBytesRead = pBytesRead;   }   public long getpContentLength() {     return pContentLength;   }   public void setpContentLength(long pContentLength) {     this.pContentLength = pContentLength;   }   public int getpItems() {     return pItems;   }   public void setpItems(int pItems) {     this.pItems = pItems;   }   @Override   public String toString() {     float tmp = (float)pBytesRead;     float result = tmp/pContentLength*100;     return "ProgressEntity [pBytesRead=" + pBytesRead + ", pContentLength="         + pContentLength + ", percentage=" + result + "% , pItems=" + pItems + "]";   } } 

最后,是繼承 CommonsMultipartResolver 類的自定義文件上傳處理類:

 

import java.util.List; import javax.servlet.http.HttpServletRequest; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.FileUpload; import org.apache.commons.fileupload.FileUploadBase; import org.apache.commons.fileupload.FileUploadException; import org.apache.commons.fileupload.servlet.ServletFileUpload; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.multipart.MaxUploadSizeExceededException; import org.springframework.web.multipart.MultipartException; import org.springframework.web.multipart.commons.CommonsMultipartResolver; public class CustomMultipartResolver extends CommonsMultipartResolver{  @Autowired  private UploadProgressListener uploadProgressListener;  @Override  protected MultipartParsingResult parseRequest(HttpServletRequest request) throws MultipartException {    String encoding = determineEncoding(request);    FileUpload fileUpload = prepareFileUpload(encoding);    uploadProgressListener.setSession(request.getSession());//問文件上傳進度監聽器設置session用于存儲上傳進度    fileUpload.setProgressListener(uploadProgressListener);//將文件上傳進度監聽器加入到 fileUpload 中    try {      List<FileItem> fileItems = ((ServletFileUpload) fileUpload).parseRequest(request);      return parseFileItems(fileItems, encoding);    }    catch (FileUploadBase.SizeLimitExceededException ex) {      throw new MaxUploadSizeExceededException(fileUpload.getSizeMax(), ex);    }    catch (FileUploadBase.FileSizeLimitExceededException ex) {      throw new MaxUploadSizeExceededException(fileUpload.getFileSizeMax(), ex);    }    catch (FileUploadException ex) {      throw new MultipartException("Failed to parse multipart servlet request", ex);    }  }}

3.此時,所有需要的類已經準備好,接下來我們需要將 spring 默認的文件上傳處理類取消自動配置,并將 multipartResolver 指向我們剛剛創建好的繼承 CommonsMultipartResolver 類的自定義文件上傳處理類。

import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.EnableAutoConfiguration;import org.springframework.boot.autoconfigure.web.MultipartAutoConfiguration;import org.springframework.boot.web.servlet.ServletComponentScan;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.ComponentScan;import org.springframework.context.annotation.Configuration;import org.springframework.web.multipart.MultipartResolver;import com.example.listener.CustomMultipartResolver;/* * 將 spring 默認的文件上傳處理類取消自動配置,這一步很重要,沒有這一步,當multipartResolver重新指向了我們定義好 * 的新的文件上傳處理類后,前臺傳回的 file 文件在后臺獲取會是空,加上這句話就好了,推測不加這句話,spring 依然 * 會先走默認的文件處理流程并修改request對象,再執行我們定義的文件處理類。(這只是個人推測) * exclude表示自動配置時不包括Multipart配置 */@EnableAutoConfiguration(exclude = {MultipartAutoConfiguration.class})@Configuration@ComponentScan(basePackages = {"com.example"})@ServletComponentScan(basePackages = {"com.example"})public class UploadProgressApplication {/* * 將 multipartResolver 指向我們剛剛創建好的繼承 CommonsMultipartResolver 類的自定義文件上傳處理類 */@Bean(name = "multipartResolver")public MultipartResolver multipartResolver() {  CustomMultipartResolver customMultipartResolver = new CustomMultipartResolver();  return customMultipartResolver;}public static void main(String[] args) {  SpringApplication.run(UploadProgressApplication.class, args);}}

至此,準備工作完成,我們再創建一個測試用的 controller 和 html 頁面用于文件上傳。 

controller:

import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.bind.annotation.ResponseBody;import org.springframework.web.multipart.MultipartFile;import org.springframework.web.servlet.ModelAndView;@Controller@RequestMapping("/uploadProgress")public class UploadController {  @RequestMapping(value = "/showUpload", method = RequestMethod.GET)  public ModelAndView showUpload() {    return new ModelAndView("/UploadProgressDemo");  }  @RequestMapping("/upload")  @ResponseBody  public void uploadFile(MultipartFile file) {    System.out.println(file.getOriginalFilename());  }}

HTML:

<!DOCTYPE html><html><head>  <meta charset="UTF-8"></meta>  <title>測試</title>這里寫代碼片</head><body>  這是文件上傳頁面  <form action="/uploadProgress/upload" method="POST" enctype="multipart/form-data">    <input type="file" name="file"/>    <br/>    <input type="submit" value="提交"/>  </form></body></html>

經本人測試,確實可以獲取文件上傳進度,前臺頁面修改進度條進度可以采用前臺頁面輪詢的方式訪問后臺,在相應action中通過存儲在session中的對象 status 來獲取最新的上傳進度并返回展示即可。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲精品视频在线播放| 色多多国产成人永久免费网站| 欧美成人一区在线| 亚洲乱亚洲乱妇无码| 日韩风俗一区 二区| 欧美精品久久久久a| 亚洲美女视频网| 国产第一区电影| 国产成人精品一区| 日本久久久久久久| 国产精品久久久久久久久久久新郎| 亚洲精品综合久久中文字幕| 国产精品久久一区主播| 欧美国产第一页| 美女av一区二区| 俺也去精品视频在线观看| 深夜成人在线观看| 国产精品jizz在线观看麻豆| 精品成人乱色一区二区| 久久艳片www.17c.com| 国产精品久久久av| 久久成人精品一区二区三区| 国产美女91呻吟求| 亚洲欧洲日韩国产| 日本高清视频精品| 91精品一区二区| 国产精品旅馆在线| 成人h片在线播放免费网站| 亚洲片国产一区一级在线观看| 成人性生交大片免费看小说| 91亚洲国产精品| 伊人成人开心激情综合网| 国产在线视频一区| 中文字幕日韩av| 精品在线欧美视频| 久久婷婷国产麻豆91天堂| 成人美女免费网站视频| 中文.日本.精品| 欧美在线一级视频| 欧美电影免费观看| 国产精品精品久久久| 97视频在线免费观看| 亚洲高清在线观看| 欧美日韩亚洲精品一区二区三区| 欧美理论电影网| 国产性色av一区二区| 一本色道久久88精品综合| 亚洲一区二区国产| 亚洲精美色品网站| 国产精品久久久久久久app| 91po在线观看91精品国产性色| 九九热这里只有精品免费看| 国产亚洲欧美日韩精品| 国产v综合ⅴ日韩v欧美大片| 久久久久久噜噜噜久久久精品| 日韩女优人人人人射在线视频| 中文字幕日韩高清| 中文字幕日本欧美| 久久精品国产亚洲精品2020| 国产亚洲在线播放| 国产精品爱啪在线线免费观看| 国产精品高清免费在线观看| www国产精品com| 欧美激情成人在线视频| 国产精品亚洲美女av网站| 午夜精品视频网站| 亚洲v日韩v综合v精品v| 欧美激情视频网址| 亚洲人成啪啪网站| 精品久久久久久久大神国产| 国产精品一香蕉国产线看观看| 中文字幕免费精品一区高清| 久久男人的天堂| 精品亚洲一区二区三区| 国产精品女视频| 国产精品电影久久久久电影网| 亚洲品质视频自拍网| 亚洲第一在线视频| 91在线观看免费网站| 国产精品久久久久久久久久久新郎| 国产69久久精品成人看| 久久6免费高清热精品| 亚洲欧美日韩在线一区| 日韩中文字幕精品| 国产一区二区在线免费视频| 亚洲精品网站在线播放gif| 国产偷国产偷亚洲清高网站| 91精品国产自产在线观看永久| 亚洲男人天堂古典| 伊人伊人伊人久久| 欧美日韩美女在线观看| 色悠悠久久久久| 亚洲福利在线播放| 欧美大胆在线视频| 国产日韩欧美在线视频观看| 96pao国产成视频永久免费| 91亚洲国产成人精品性色| 亚洲风情亚aⅴ在线发布| 亚洲天堂免费观看| 91国产高清在线| 亚洲精品久久久久中文字幕二区| 51ⅴ精品国产91久久久久久| 亚洲区在线播放| 久久久极品av| 国产精品美腿一区在线看| 欧美激情亚洲一区| 亚洲午夜精品久久久久久性色| 亚洲国产日韩欧美在线动漫| 国产成人+综合亚洲+天堂| 中文字幕亚洲一区二区三区五十路| 亚洲理论在线a中文字幕| 欧美人在线观看| 国产在线高清精品| 欧美成人高清视频| 欧美极品在线视频| 国产精品你懂得| 精品国产一区二区三区四区在线观看| 国产欧美一区二区三区视频| 久久久久久91| 亚洲国产97在线精品一区| 91在线视频免费| 麻豆国产精品va在线观看不卡| 91精品久久久久久久久久久久久久| 亚洲视频网站在线观看| 欧美午夜无遮挡| 欧美在线免费视频| 成人xxxx视频| 久久久久亚洲精品成人网小说| 久久久噜噜噜久久| 国产精品亚发布| 国产精品久久久久久一区二区| 91精品国产综合久久香蕉最新版| 5252色成人免费视频| 欧美电影在线观看| 亚洲精品久久久久久久久久久久久| 久久人体大胆视频| 亚洲精品v天堂中文字幕| 久久精品免费播放| 久久精品电影网| 亚洲白虎美女被爆操| 成人激情视频小说免费下载| 亚洲国产美女精品久久久久∴| 日韩欧美在线第一页| 久久九九全国免费精品观看| 亚洲一区二区三区视频| 狠狠操狠狠色综合网| 久久精品精品电影网| 国产精品视频在线播放| 91精品国产成人| 国产精品久久久久久久久久久久久久| 国产成人精品999| 亚洲第一级黄色片| 91日本在线视频| 91精品视频网站| 欧美一区二区三区精品电影| 青青在线视频一区二区三区| 国产精品视频网站| 欧美午夜丰满在线18影院| 亚洲视频在线播放| 欧美精品久久久久久久免费观看| 热久久99这里有精品| 欧美一级电影免费在线观看| 深夜福利91大全| 精品国产一区二区三区久久狼5月|