SSM框架如何实现ftp上传文件进度回调
- 创建监听器,监听器需实现ProgressListener类
import controller.ViewObject.ProgressEntity;
import org.apache.commons.fileupload.ProgressListener;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpSession;
@Component
public class MyProgressListener implements ProgressListener {
private HttpSession session;
public HttpSession getSession() {
return session;
}
public void setSession(HttpSession session) {
this.session = session;
ProgressEntity status = new ProgressEntity();
session.setAttribute("status", status);
}
/*
* pBytesRead 到目前为止读取文件的比特数 pContentLength 文件总大小 pItems 目前正在读取第几个文件
*/
public void update(long pBytesRead, long pContentLength, int pItems) {
ProgressEntity status = (ProgressEntity) session.getAttribute("status");
status.setpBytesRead(pBytesRead);
status.setpContentLength(pContentLength);
status.setpItems(pItems);
}
}
- 创建解析器,解析器需继承CommonsMultipartResolver类
import controller.listener.MyProgressListener;
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;
import javax.servlet.http.HttpServletRequest;
import java.util.List;
public class CustomMultipartResolver extends CommonsMultipartResolver{
@Autowired
private MyProgressListener progressListener;
public void setProgressListener(MyProgressListener progressListener){
this.progressListener=progressListener;
}
@Override
/*@SuppressWarnings("unchecked")*/
public MultipartParsingResult parseRequest(HttpServletRequest request)
throws MultipartException {
String encoding = determineEncoding(request);
FileUpload fileUpload = prepareFileUpload(encoding);
progressListener.setSession(request.getSession());
fileUpload.setProgressListener(progressListener);
try {
List<FileItem> fileItems = ((ServletFileUpload) fileUpload).parseRequest(request);
return parseFileItems(fileItems, encoding);
} catch (FileUploadBase.SizeLimitExceededException ex) {
throw new MaxUploadSizeExceededException(fileUpload.getSizeMax(), ex);
} catch (FileUploadException ex) {
throw new MultipartException("Could not parse multipart servlet request", ex);
}
}
/*https://blog.csdn.net/Dopamy_BusyMonkey/article/details/51823414*/
}
- 创建实体类
public 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 + "]";
}
}
- 在xml里面配置解析器
<bean id="multipartResolver" class="controller.resolver.CustomMultipartResolver">
<property name="maxUploadSize" value="10240000000"/>
<property name="maxInMemorySize" value="4096"></property>
<property name="defaultEncoding" value="UTF-8"></property>
</bean>
- 创建controller类
@RequestMapping("/uploadToFtpServer")
@ResponseBody
public ResponseUtil upload(VideoFtpVo videoFtpVo, @RequestParam CommonsMultipartFile file){
ResponseUtil responseUtil=new ResponseUtil();
try {
String name=RenameUtil.renameFilename(file.getOriginalFilename());
String message=FtpUtil.uploadFile(name,file.getInputStream());
VideoInfoVo videoInfoVo=new VideoInfoVo();
BeanUtils.copyProperties(videoInfoVo,videoFtpVo);//注意是将后面的值赋给前面
videoInfoVo.setFileName(message);
/*String video_id=UploadVideo.UploadVideo(videoInfoVo);*/
Integer user_id=Integer.parseInt(RedisUtil.get("user_id"));
Integer video_id=videoService.addVideoToFtp(videoInfoVo);
/*videoService.addVideoId(user_id,video_id,VedioFtpVo.getTitle());*/
responseUtil.setStatus(200);
responseUtil.setMessage(video_id.toString());
return responseUtil;
} catch (IOException e) {
e.printStackTrace();
responseUtil.setStatus(500);
responseUtil.setMessage("上传失败!"+e);
return responseUtil;
}
}
@RequestMapping("/callback")
@ResponseBody
public String callback(HttpServletRequest httpServletRequest){
ProgressEntity status= (ProgressEntity) httpServletRequest.getSession().getAttribute("status");
try {
if (status!=null){
long byteRead=status.getpBytesRead();
long contentLength=status.getpContentLength();
NumberFormat numberFormat=NumberFormat.getPercentInstance();//这句是什么意思
numberFormat.setMinimumFractionDigits(2);
numberFormat.setRoundingMode(RoundingMode.HALF_UP);
String percent = numberFormat.format(byteRead*1.0/contentLength);//上传文件的百分比
return percent;
}else
return "0.00";
} catch (Exception e) {
e.printStackTrace();
return String.valueOf(e);
}
}
借鉴了https://blog.csdn.net/Dopamy_BusyMonkey/article/details/51823414的博客,稍作改动,不知道有没有侵权。