public void setprogressListener(ProgressListener pListener)
listener = pListener;
ProgressListener是一个接口,我们需要自己实现它的update方法,参数pBytesRead表示已经上传到服务器的字节数,pContentLength表示所有文件的总大小,pItems表示第几个文件:
{
return new ServletFileUpload(fileItemFactory);
}
我们要做的就是实现ProgressListener类
public class FileUploadListener implements ProgressListener {
private long num100Ks = 0;
private long theBytesRead = 0;
private long theContentLength = -1;
private int whichItem = 0;
private int percentDone = 0;
private boolean contentLengthKnown = false;
public void update(long bytesRead, long contentLength, int items) {
if (contentLength > -1) {
contentLengthKnown = true;
}
theBytesRead = bytesRead;
theContentLength = contentLength;
whichItem = items;
long nowNum100Ks = bytesRead / 100000;
if (nowNum100Ks > num100Ks) {
num100Ks = nowNum100Ks;
if (contentLengthKnown) {
percentDone = (int) Math.round(100.00 * bytesRead / contentLength);
}
}
}
public int getPercentDone() {
return percentDone;
}
}
SpringMVC没有实现监听器,所以如果要监听的话得自己扩展CommonsMultipartResolver 类,在newFileUpload里面加入代码设置自己实现的监听器:
public class CommonsMultipartResolver Ext extends CommonsMultipartResolver {
private HttpServletRequest request;
@Override
protected FileUpload newFileUpload(FileItemFactory fileItemFactory)
{
ServletFileUpload upload = new ServletFileUpload(fileItemFactory);
upload.setSizeMax(-1);
if(request!=null)
{
///System.out.println("注入监听");
FileUploadListener uploadProgressListener = new FileUploadListener();
upload.setProgressListener(uploadProgressListener);
HttpSession session = request.getSession();
session.setAttribute("uploadProgressListener", uploadProgressListener);
}
return upload;
}
@Override
public MultipartHttpServletRequ est resolveMultipart(HttpServletRequest request) throws MultipartException {
}
建一个servlet用ajax去取进度就可以了
public class ProgressServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
response.setContentType("text/html");
response.setHeader("Cache-Control", "no-cache");
PrintWriter out = response.getWriter();
HttpSession session = request.getSession(true);
if (session == null) {
out.println("Sorry, session is null"); // just to be safe
return;
}
FileUploadListener uploadProgressListener = (FileUploadListener) session.getAttribute("uploadProgressListener");
if (uploadProgressListener == null) {
out.println("Progress listener is null");
return;
}
int ret=uploadProgressListener.getPercentDone();
System.out.println("new ->:"+String.valueOf(ret));
out.println(ret);
}
}
- 在Spring的配置文件中添加
Xml代码 - id="multipartResolver" class="net.gkyh.filter.CommonsMultipartResolver
Ext"> - name="defaultEncoding"
value="UTF-8" />
Spring Controller
@RequestMapping(value="/AppUpload.action",method=RequestMethod.POST)
public ModelAndView Upload(HttpServletRequest request,HttpServletResponse response,
@RequestParam("flag")String flag,ModelMap modelMap){
try
{
String path= request.getSession().getServletContext().getRealPath("/");
path=path.substring(0,path.length()-1);
path=path.substring(0,p);
path=path.replace("\","/");
String folderPath=path+"/ftp/upload/";
MultipartHttpServletRequ est multipartRequest = (MultipartHttpServletRequ est) request;
InputStream stream = file.getInputStream();
String fileName = file.getOriginalFilename();
//System.out.println(fileName);
}
catch(Exception e) {
e.printStackTrace();
}
return new ModelAndView("/appupload",modelMap);
}
jsp页面
<SCRIPT type=text/javascript>
function doProgressLoop(prog, max, counter) {
counter = counter + 1;
document.getElementByIdx_x_x('progressBarText').innerHTML = 'upload in progress: ' + prog + '%';
document.getElementByIdx_x_x('progressBarBoxContent').style.width = parseInt(prog) + '%';
}
function getProgress() {
$.ajax({
}
function fSubmit()
{
var button = window.document.getElementByIdx_x_x("submitButton");
button.disabled = true;
var max = 100;
var prog = 0;
var counter = 0;
document.getElementByIdx_x_x('progressBar').style.display = 'block';
document.getElementByIdx_x_x('progressBarText').innerHTML = 'upload in progress: 0%';
getProgress();
doProgressLoop(prog, max, counter);
document.getElementByIdx_x_x("form1").submit();
}
</SCRIPT>
<form name="form1" id="form1" action="AppLoad.action" method="post" enctype="multipart/form-data">
<span>选择文件</span>
<div style="padding-bottom:5px;">
<input type="file" size="48" name="filedata" id='filedata'>
</div>
<div id="progressBar" style="display: none;">
<div id="theMeter">
<div id="progressBarText"></div>
<div id="progressBarBox" style="color:Silver;border-width:1px;border-style:Solid;width:300px;TEXT-ALIGN:left">
<div id="progressBarBoxContent" style="background-color:#3366FF; height:15px; width:0%;TEXT-ALIGN:left"></div>
</div>
<div id="progress-content" style="display: none;"></div>
</div>
</div>
<INPUT id='submitButton' tabIndex=3 type=button value="提交" οnclick='fSubmit();' >
</form>
以下链接是servlet上传文件进度实例,本文使用了部分内容