ServletFileUpload 的 setProgressListener 要等文件上传完毕才会执行吗?

xcfdsarfew 2018-02-06 04:03:06
ServletFileUpload 的 setProgressListener 要等文件上传完毕才会执行吗?

如果我上传一个30M的文件,那至少要等1分钟才会执行 setProgressListener
请问有大神在吗?而且执行的时候 看了流量监控 已经不在上传文件了



ServletFileUpload upload = new ServletFileUpload(factory);

//写入进度条
upload.setProgressListener(new ProgressListener() {
@Override
public void update(long pBytesRead, long pContentLength, int pItems) {
ProcessInfo pri = new ProcessInfo();
pri.setItemNum(pItems);
pri.setReadSize(pBytesRead);
pri.setTotalSize(pContentLength);
pri.setBewrite( pBytesRead+"/"+pContentLength+" byte");
pri.setRatio( Math.round(new Float(pBytesRead) / new Float(pContentLength)*100));
System.out.println("----------------进度:"+Math.round(new Float(pBytesRead) / new Float(pContentLength)*100));
hs.setAttribute(TEMPLET_FILE_PROCESS_SESSION, pri);
}
});

...全文
591 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
oO临时工Oo 2018-02-26
  • 打赏
  • 举报
回复
~~~~~~~~~~~~~~Test~~~~~~~~~~~~~~~`
oO临时工Oo 2018-02-09
  • 打赏
  • 举报
回复
引用 5 楼 trocp 的回复:
@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		log.debug("-------------do post-------------------");
		// 创建解析工厂
		DiskFileItemFactory factory = new DiskFileItemFactory();
		factory.setRepository(new File(System.getProperty("java.io.tmpdir")));// 设置文件缓存目录
		ServletFileUpload upload = new ServletFileUpload(factory);
		upload.setHeaderEncoding("UTF-8");
		UploadListener listener = new UploadListener();
		upload.setProgressListener(listener);

		try {
			List<FileItem> list = upload.parseRequest(request);//通过此调用,commons.fileupload会感知文件进度,同时调用监听器UploadListener
			log.debug("size is " + list.size());
			for (FileItem item : list) {
				//TODO more 
			}
		} catch (FileUploadException e) {
			log.error(e.getMessage(), e);
			response.getWriter().println("上传发生错误:" + e.getMessage());
		}
	}



class UploadListener implements ProgressListener{  
	private static final Log log = LogFactory.getLog(ProgressListener.class);
    
    /**
     * @param bytesRead 已读取数据长度  
     * @param contentLength 文件总长度  
     * @param items  正在保存第几个文件
     */
    @Override  
    public void update(long bytesRead, long contentLength, int items) {
    	System.out.println(items + ":" + bytesRead + "/" + contentLength);
    	log.debug(items + ":" + bytesRead + "/" + contentLength);
    }  
}
补充:需要引用commons-fileupload和commons-io 以下是maven的引用方式

<dependency>
			<groupId>commons-fileupload</groupId>
			<artifactId>commons-fileupload</artifactId>
			<version>1.2.2</version>
		</dependency>
		<dependency>
			<groupId>org.apache.commons</groupId>
			<artifactId>commons-io</artifactId>
			<version>1.3.2</version>
		</dependency>
oO临时工Oo 2018-02-09
  • 打赏
  • 举报
回复
@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		log.debug("-------------do post-------------------");
		// 创建解析工厂
		DiskFileItemFactory factory = new DiskFileItemFactory();
		factory.setRepository(new File(System.getProperty("java.io.tmpdir")));// 设置文件缓存目录
		ServletFileUpload upload = new ServletFileUpload(factory);
		upload.setHeaderEncoding("UTF-8");
		UploadListener listener = new UploadListener();
		upload.setProgressListener(listener);

		try {
			List<FileItem> list = upload.parseRequest(request);//通过此调用,commons.fileupload会感知文件进度,同时调用监听器UploadListener
			log.debug("size is " + list.size());
			for (FileItem item : list) {
				//TODO more 
			}
		} catch (FileUploadException e) {
			log.error(e.getMessage(), e);
			response.getWriter().println("上传发生错误:" + e.getMessage());
		}
	}



class UploadListener implements ProgressListener{  
	private static final Log log = LogFactory.getLog(ProgressListener.class);
    
    /**
     * @param bytesRead 已读取数据长度  
     * @param contentLength 文件总长度  
     * @param items  正在保存第几个文件
     */
    @Override  
    public void update(long bytesRead, long contentLength, int items) {
    	System.out.println(items + ":" + bytesRead + "/" + contentLength);
    	log.debug(items + ":" + bytesRead + "/" + contentLength);
    }  
}
Sunyiban 2018-02-07
  • 打赏
  • 举报
回复
看看这个:http://blog.csdn.net/qq_33460865/article/details/52902634
xcfdsarfew 2018-02-06
  • 打赏
  • 举报
回复
引用 1 楼 kampoo 的回复:
貌似你的问题是在网络传输完成后才调用的 ProgressListener,应该跟你创建 ServletFileUpload 实例的上下文有关。 是不是创建ServletFileUpload实例时整个传输过程已经完成了呢?如果使用spring,请使用spring自带的文件上传组件。 而类ServletFileUpload 建议在一个标准的Servlet中创建实例。
没允许用开源架构
xcfdsarfew 2018-02-06
  • 打赏
  • 举报
回复
引用 1 楼 kampoo 的回复:
貌似你的问题是在网络传输完成后才调用的 ProgressListener,应该跟你创建 ServletFileUpload 实例的上下文有关。 是不是创建ServletFileUpload实例时整个传输过程已经完成了呢?如果使用spring,请使用spring自带的文件上传组件。 而类ServletFileUpload 建议在一个标准的Servlet中创建实例。
没用spring 只是用了servlet
kampoo 2018-02-06
  • 打赏
  • 举报
回复
貌似你的问题是在网络传输完成后才调用的 ProgressListener,应该跟你创建 ServletFileUpload 实例的上下文有关。 是不是创建ServletFileUpload实例时整个传输过程已经完成了呢?如果使用spring,请使用spring自带的文件上传组件。 而类ServletFileUpload 建议在一个标准的Servlet中创建实例。

67,512

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧