SpringBoot上傳文件如何返回前端進(jìn)度條
SpringBoot上傳文件返回前端進(jìn)度條
話不多說(shuō),直接上干貨
1、需要?jiǎng)?chuàng)建一個(gè)實(shí)現(xiàn)了processListener接口
的實(shí)現(xiàn)類(lèi)用于監(jiān)聽(tīng)文件上傳進(jìn)度
import javax.servlet.http.HttpSession;
import org.apache.commons.fileupload.ProgressListener;
import org.springframework.stereotype.Component;
@Component
public class UploadProgressListener implements ProgressListener {
private HttpSession session;
public void setSession(HttpSession session){
this.session=session;
ProgressEntity status = new ProgressEntity();
session.setAttribute("status", status);
}
/* pBytesRead 到目前為止讀取文件的比特?cái)?shù)
* pContentLength 文件總大小
* pItems 目前正在讀取第幾個(gè)文件
*/
public void update(long pBytesRead, long pContentLength, int pItems) {
ProgressEntity status = (ProgressEntity) session.getAttribute("status");
status.setPBytesRead(pBytesRead);
status.setPContentLength(pContentLength);
status.setPItems(pItems);
System.out.println("UploadProgressListener update ProgressEntity: "+status.toString());
}
}
2、返回給前端的上傳進(jìn)度的實(shí)體類(lèi)
@Component
public class ProgressEntity {
// 讀取的文件的比特?cái)?shù)
private long pBytesRead = 0L;
// 文件的總大小
private long pContentLength = 0L;
// 目前正在讀取第幾個(gè)文件
private int pItems;
private long startTime = System.currentTimeMillis();
public ProgressEntity() {
pBytesRead = 0L;
pContentLength = 0L;
}
public long getPBytesRead() {
return pBytesRead;
}
public void setPBytesRead(long bytesRead) {
pBytesRead = bytesRead;
}
public long getPContentLength() {
return pContentLength;
}
public void setPContentLength(long contentLength) {
pContentLength = contentLength;
}
public int getPItems() {
return pItems;
}
public void setPItems(int items) {
pItems = items;
}
@Override
public String toString() {
float tmp = (float) pBytesRead;
float result = tmp / pContentLength * 100;
return "ProgressEntity [pBytesRead=" + pBytesRead + ", pContentLength="
+ pContentLength + ", percentage=" + result + "% , pItems=" + pItems + "]";
}
}
3、繼承CommonsMultipartResolver類(lèi)
自定義文件上傳處理類(lèi)
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());// 文件上傳進(jìn)度監(jiān)聽(tīng)器設(shè)置session用于存儲(chǔ)上傳進(jìn)度
fileUpload.setProgressListener(uploadProgressListener);// 將文件上傳進(jìn)度監(jiān)聽(tīng)器加入到 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);
}
}
}
4、將spring默認(rèn)的文件上傳處理類(lèi)取消自動(dòng)配置
并將 multipartResolver 指向我們剛剛創(chuàng)建好的繼承 CommonsMultipartResolver 類(lèi)的自定義文件上傳處理類(lèi)
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.multipart.MultipartResolver;
import com.baidu.doclabel.biz.listener.CustomMultipartResolver;
@EnableAutoConfiguration
@Configuration
public class UploadProgressApplication {
@Bean(name = "multipartResolver")
public MultipartResolver multipartResolver() {
CustomMultipartResolver customMultipartResolver = new CustomMultipartResolver();
return customMultipartResolver;
}
}
至此,SpringBoot上傳文件實(shí)現(xiàn)進(jìn)度條代碼編寫(xiě)完成,看效果
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
java向上轉(zhuǎn)型發(fā)生的時(shí)機(jī)知識(shí)點(diǎn)詳解
在本篇文章里小編給大家整理分享的是關(guān)于java向上轉(zhuǎn)型發(fā)生的時(shí)機(jī)知識(shí)點(diǎn)內(nèi)容,有興趣的讀者們可以參考下。2021-05-05
IntelliJ?idea報(bào)junit?no?tasks?available問(wèn)題的解決辦法
這篇文章主要給大家介紹了關(guān)于IntelliJ?idea報(bào)junit?no?tasks?available問(wèn)題的解決辦法,文中通過(guò)圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-11-11
Java實(shí)現(xiàn)隨機(jī)出題,10道10以內(nèi)加減法計(jì)算代碼實(shí)例
這篇文章主要介紹了Java實(shí)現(xiàn)隨機(jī)出題,10道10以內(nèi)加減法計(jì)算,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04
Springboot中動(dòng)態(tài)語(yǔ)言groovy介紹
Apache的Groovy是Java平臺(tái)上設(shè)計(jì)的面向?qū)ο缶幊陶Z(yǔ)言,這門(mén)動(dòng)態(tài)語(yǔ)言擁有類(lèi)似Python、Ruby和Smalltalk中的一些特性,可以作為Java平臺(tái)的腳本語(yǔ)言使用,這篇文章主要介紹了springboot中如何使用groovy,需要的朋友可以參考下2022-09-09
如何使用兩個(gè)棧實(shí)現(xiàn)隊(duì)列Java
這篇文章主要介紹了如何使用兩個(gè)棧實(shí)現(xiàn)隊(duì)列Java,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11
前端如何調(diào)用后端接口進(jìn)行數(shù)據(jù)交互詳解(axios和SpringBoot)
一般來(lái)講前端不會(huì)給后端接口,而是后端給前端接口的情況比較普遍,下面這篇文章主要給大家介紹了關(guān)于前端如何調(diào)用后端接口進(jìn)行數(shù)據(jù)交互的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-03-03
java 實(shí)現(xiàn)取int型的第二個(gè)字節(jié)的數(shù)
這篇文章主要介紹了java 實(shí)現(xiàn)取int型的第二個(gè)字節(jié)的數(shù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01

