spring mvc 实现上传文件进度条

原文链接

一、实现org.apache.commons.fileupload.ProgressListener接口

Java代码   收藏代码
  1. import javax.servlet.http.HttpSession;  
  2.   
  3. import org.apache.commons.fileupload.ProgressListener;  
  4. import org.springframework.stereotype.Component;  
  5.   
  6. import com.chinalife.cip.web.multipart.model.Progress;  
  7.   
  8. @Component  
  9. public class FileUploadProgressListener implements ProgressListener {  
  10.     private HttpSession session;  
  11.   
  12.     public void setSession(HttpSession session){  
  13.         this.session=session;  
  14.         Progress status = new Progress();  
  15.         session.setAttribute("status", status);  
  16.     }  
  17.   
  18.     /* 
  19.      * pBytesRead 到目前为止读取文件的比特数 pContentLength 文件总大小 pItems 目前正在读取第几个文件 
  20.      */  
  21.     public void update(long pBytesRead, long pContentLength, int pItems) {  
  22.         Progress status = (Progress) session.getAttribute("status");  
  23.         status.setpBytesRead(pBytesRead);  
  24.         status.setpContentLength(pContentLength);  
  25.         status.setpItems(pItems);  
  26.     }  
  27.   
  28. }  
import javax.servlet.http.HttpSession;

import org.apache.commons.fileupload.ProgressListener;
import org.springframework.stereotype.Component;

import com.chinalife.cip.web.multipart.model.Progress;

@Component
public class FileUploadProgressListener implements ProgressListener {
private HttpSession session;

public void setSession(HttpSession session){
	this.session=session;
	Progress status = new Progress();
	session.setAttribute("status", status);
}

/*
 * pBytesRead 到目前为止读取文件的比特数 pContentLength 文件总大小 pItems 目前正在读取第几个文件
 */
public void update(long pBytesRead, long pContentLength, int pItems) {
	Progress status = (Progress) session.getAttribute("status");
	status.setpBytesRead(pBytesRead);
	status.setpContentLength(pContentLength);
	status.setpItems(pItems);
}

}

 

 

二、扩展org.springframework.web.multipart.commons.CommonsMultipartResolver类,重写public MultipartParsingResult parseRequest(HttpServletRequest request) throws MultipartException方法

Java代码   收藏代码
  1. import java.util.List;  
  2.   
  3. import javax.servlet.http.HttpServletRequest;  
  4.   
  5. import org.apache.commons.fileupload.FileItem;  
  6. import org.apache.commons.fileupload.FileUpload;  
  7. import org.apache.commons.fileupload.FileUploadBase;  
  8. import org.apache.commons.fileupload.FileUploadException;  
  9. import org.apache.commons.fileupload.servlet.ServletFileUpload;  
  10. import org.springframework.beans.factory.annotation.Autowired;  
  11. import org.springframework.web.multipart.MaxUploadSizeExceededException;  
  12. import org.springframework.web.multipart.MultipartException;  
  13. import org.springframework.web.multipart.commons.CommonsMultipartResolver;  
  14.   
  15. import com.chinalife.cip.web.multipart.listener.FileUploadProgressListener;  
  16.   
  17. public class CustomMultipartResolver extends CommonsMultipartResolver {  
  18.     @Autowired  
  19.     private FileUploadProgressListener progressListener;  
  20.       
  21.     public void setFileUploadProgressListener(FileUploadProgressListener progressListener){  
  22.         this.progressListener=progressListener;  
  23.     }  
  24.       
  25.     @Override  
  26.     @SuppressWarnings("unchecked")  
  27.     public MultipartParsingResult parseRequest(HttpServletRequest request)  
  28.             throws MultipartException {  
  29.         String encoding = determineEncoding(request);  
  30.         FileUpload fileUpload = prepareFileUpload(encoding);  
  31.         progressListener.setSession(request.getSession());  
  32.         fileUpload.setProgressListener(progressListener);  
  33.         try {  
  34.             List<FileItem> fileItems = ((ServletFileUpload) fileUpload).parseRequest(request);  
  35.             return parseFileItems(fileItems, encoding);  
  36.         }  
  37.         catch (FileUploadBase.SizeLimitExceededException ex) {  
  38.             throw new MaxUploadSizeExceededException(fileUpload.getSizeMax(), ex);  
  39.         }  
  40.         catch (FileUploadException ex) {  
  41.             throw new MultipartException("Could not parse multipart servlet request", ex);  
  42.         }  
  43.     }  
  44. }  
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;

import com.chinalife.cip.web.multipart.listener.FileUploadProgressListener;

public class CustomMultipartResolver extends CommonsMultipartResolver {
@Autowired
private FileUploadProgressListener progressListener;

public void setFileUploadProgressListener(FileUploadProgressListener 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&lt;FileItem&gt; 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);
	}
}

}

 

 

三、mvc命名空间声明

Xml代码   收藏代码
  1. <bean id="multipartResolver" class="com.chinalife.cip.web.multipart.CustomMultipartResolver">  
  2.     <property name="maxUploadSize" value="50000000" />  
  3. </bean>  
<bean id="multipartResolver" class="com.chinalife.cip.web.multipart.CustomMultipartResolver">
	<property name="maxUploadSize" value="50000000" />
</bean>

 

 

四、获取文件controller编写

Java代码   收藏代码
  1. @RequestMapping(...)  
  2. public String uploadFile(@RequestParam(value = "file") MultipartFile... files) throws IOException {  
  3.     for (MultipartFile f : files) {  
  4.         if (f.getSize() > 0) {  
  5.             File targetFile = new File("目标文件路径及文件名");  
  6.             f.transferTo(targetFile);//写入目标文件  
  7.         }  
  8.     }  
  9.     return "...";  
  10. }  
@RequestMapping(...)
public String uploadFile(@RequestParam(value = "file") MultipartFile... files) throws IOException {
	for (MultipartFile f : files) {
		if (f.getSize() > 0) {
			File targetFile = new File("目标文件路径及文件名");
			f.transferTo(targetFile);//写入目标文件
		}
	}
	return "...";
}

 

 

五、文件进度controller编写

Java代码   收藏代码
  1. import java.util.Map;  
  2.   
  3. import org.springframework.stereotype.Controller;  
  4. import org.springframework.web.bind.annotation.RequestMapping;  
  5. import org.springframework.web.bind.annotation.RequestMethod;  
  6. import org.springframework.web.bind.annotation.ResponseBody;  
  7. import org.springframework.web.bind.annotation.SessionAttributes;  
  8.   
  9. import com.chinalife.cip.web.multipart.model.Progress;  
  10.   
  11. @Controller  
  12. @SessionAttributes("status")  
  13. public class ProgressController {  
  14.   
  15.     @RequestMapping(value = "/upfile/progress", method = RequestMethod.POST )  
  16.     @ResponseBody  
  17.     public String initCreateInfo(Map<String, Object> model) {  
  18.         Progress status = (Progress) model.get("status");  
  19.         if(status==null){  
  20.             return "{}";  
  21.         }  
  22.         return status.toString();  
  23.     }  
  24. }  
import java.util.Map;

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.bind.annotation.SessionAttributes;

import com.chinalife.cip.web.multipart.model.Progress;

@Controller
@SessionAttributes(“status”)
public class ProgressController {

@RequestMapping(value = "/upfile/progress", method = RequestMethod.POST )
@ResponseBody
public String initCreateInfo(Map&lt;String, Object&gt; model) {
	Progress status = (Progress) model.get("status");
	if(status==null){
		return "{}";
	}
	return status.toString();
}

}

 


                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值