0 0

commons-fileupload如何实现带进度条的断点续传5

大概要求如题,我已经实现了进度条,用的是dwr和commons-fileupload,但是现在我不知道该怎么实现断线续传,下面的代码是非断点的,该如何修给实现断点呢?求教各位牛人。

public class FileUploadServlet extends HttpServlet {

	private static final long serialVersionUID = 1L;

	private static final String FILE_UPLOAD_JSP = "/jsp/FileUploadForm.jsp";

	private static final long MAX_LENGTH = 1000 * 1024 * 1024L; // 1000MB

	private static final int HTTP_REDUNDANT_LENGTH = 1024; // 1KB

	protected void doGet(HttpServletRequest request, 
			HttpServletResponse response) throws ServletException, IOException {
		RequestDispatcher rd = request.getRequestDispatcher(FILE_UPLOAD_JSP);
		rd.forward(request, response);

	}

	protected void doPost(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {

		ProgressInfo pi = new ProgressInfo();
		
		try {
			this.doUpload(request, pi);
		} catch (Exception e) {
			pi.setInProgress(false);
			Util.info("FileUploadServlet", "cancelled or interrupted!");
			e.printStackTrace();
			throw new ServletException(e);
		}
	}

	private String getFileName(String fileName) {
		String name = fileName.substring(fileName.lastIndexOf("\\") + 1);
		return System.getProperty("java.io.tmpdir") + "/" + name;
	}

	private void doUpload(HttpServletRequest request, ProgressInfo pi)
			throws Exception {

		String fldName = "";
		FileItemStream item = null;
		BufferedInputStream stream = null;

		boolean isMultipart = ServletFileUpload.isMultipartContent(request);

		if (isMultipart) {
			int filesSize = request.getContentLength() - HTTP_REDUNDANT_LENGTH;
			if (filesSize >= MAX_LENGTH) {
				String errorMsg = "Error: Current files size is " + filesSize
						/ (1024 * 1024) + "MB which has exceeded max " + MAX_LENGTH + "MB";
				pi.setCompleted(true);
				pi.setErrorMsg(errorMsg);
				throw new Exception(errorMsg);
			}
			ServletFileUpload upload = new ServletFileUpload();
			upload.setHeaderEncoding("UTF-8");
			upload.setFileSizeMax(MAX_LENGTH);
			upload.setSizeMax(MAX_LENGTH);
			UploadListener uploadListener = new UploadListener(pi);
			upload.setProgressListener(uploadListener);
			// Parse the request
			FileItemIterator fIter = upload.getItemIterator(request);
			
			while (fIter.hasNext()) {
				item = fIter.next();
				fldName = item.getFieldName();
				Util.info("FileUploadServlet", fldName + ", "
						+ item.isFormField() + ", " + item.getContentType()
						+ ", " + item.getName() + ", " + item.getHeaders());

				if (!item.isFormField()) {
					fldName = item.getFieldName();
					if (item.getName() == null
							|| "".equals(item.getName().trim())) {
						continue;
					}

					pi.setCurFileName(item.getName());
					pi.setUploadedFiles(pi.getUploadedFiles() + "<b>"
							+ item.getName() + "</b><br/>");
					
					File file = new File(this.getFileName(item.getName()));
					Long size = file.length();
					if (file.exists()) {
						pi.setBytesRead(size);
					}
					stream = new BufferedInputStream(item.openStream());
					stream.skip(file.length());
					Util.info("FileUploadServlet", this.getFileName(item
							.getName()));	
					
					BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file));
					Streams.copy(stream, bos, true);
				}

			}
		}

	}

}


这个是listener代码:

public class UploadListener implements ProgressListener {

	private static final long UPDATE_THRESHOLD = 50 * 1024L; // 

	private static WebContext wctx = null;

	private ScriptProxy sp = null;

	private long megaBytes = -1;

	private ProgressInfo pi = null;

	public UploadListener() {
		wctx = WebContextFactory.get();
	}

	public UploadListener(ProgressInfo pi) {
		this.pi = pi;
	}

	public void update(long pBytesRead, long pContentLength, int pItems) {

		try {
			// Make the upload more slowly, so we can see the progress bar for small file.
			// In Prod env. it should be removed.
			Thread.sleep(10);
		} catch (Exception ex) {
			ex.printStackTrace();
		}

		if(pBytesRead + 2000 > pContentLength){
			pi.setBytesRead(pContentLength);
			sp.addFunctionCall("updateProgress", pi);
			return;
		}
		long mBytes = pBytesRead / UPDATE_THRESHOLD;
		if (megaBytes == mBytes && megaBytes > 0) {
			return;
		}
		
		megaBytes = mBytes;
		pi.setBytesRead(pBytesRead);
		pi.setFileIndex(pItems);
		pi.setTotalSize(pContentLength);

		// WebContext wctx = WebContextFactory.get();
		// org.directwebremoting.proxy.dwr.Util utilThis = new
		// org.directwebremoting.proxy.dwr.Util(wctx.getScriptSession());
		// utilThis.setValue("text", String.valueOf(pBytesRead));
		if(sp == null){
			sp = new ScriptProxy(wctx.getScriptSessionsByPage(wctx.getCurrentPage()));
		}
		sp.addFunctionCall("updateProgress", pi);

	}

	public void go() {
		System.out.println("---------go!");
	}
}


问题补充:
hu437 写道
使用commons-fileupload实现断点续传不好的,原因如下:

1、断点续传原理:首先获取文件的整个长度,然后查询已经上传了多少长度,下次读取的时候从上传完成的部分开始读取(复杂的还有文件分片等)

2、js无法获取本地硬盘上的文件信息,所以他不能从指定的大小位置可始读取文件,这个只有每次都是重新上传,这样的断点续传也没意义

建议使用flash组件进行上传,可以看一下swfupload这个组件,实现进度条等也非常方便

我简单用过swfupload,但是好像看不到它的上传代码吧?!看不到的话我应该怎么改动呢?
2011年11月11日 16:44

2个答案 按时间排序 按投票排序

0 0

他是一个封装的组件,我们不需要看到他的代码的,他们的相关的控制都可以通过JavaScript来修改的

在他的附属JS里面可以修改:提示语、文件大小限制、要提交文件事哪等;可以通过CSS来修改展现样式等

2011年11月21日 09:51
0 0

使用commons-fileupload实现断点续传不好的,原因如下:

1、断点续传原理:首先获取文件的整个长度,然后查询已经上传了多少长度,下次读取的时候从上传完成的部分开始读取(复杂的还有文件分片等)

2、js无法获取本地硬盘上的文件信息,所以他不能从指定的大小位置可始读取文件,这个只有每次都是重新上传,这样的断点续传也没意义

建议使用flash组件进行上传,可以看一下swfupload这个组件,实现进度条等也非常方便

2011年11月14日 18:25

相关推荐

    上传文件 commons-fileupload-1.1.jar jquery.ajaxfileupload.js 以及demo

    2. 支持断点续传:允许用户在上传过程中暂停并重新开始,避免因网络问题导致整个文件需要重新上传。 3. 错误处理:库提供了丰富的异常处理机制,帮助开发者捕获和处理可能出现的问题。 4. 自定义存储策略:你可以...

    SmartUpload.jar和commons-fileupload-1.1.1.jar

    在Java Web开发中,文件上传是一项常见的功能,用于接收用户通过网页上传的文件,例如...在实际开发中,还需要关注文件安全性问题,如防止文件注入攻击,以及优化大文件上传的性能,比如使用异步上传或断点续传技术。

    commons-fileupload结合XMLHttpRequest实现有进度条上传功能

    本篇文章将详细讲解如何结合Apache Commons FileUpload和XMLHttpRequest实现带进度条的文件上传功能。 首先,我们需要理解Apache Commons FileUpload的工作原理。这个库解析HTTP请求中的multipart/form-data内容,...

    commons-fileupload.jar和commons-io.jar

    在Java Web开发中,文件上传是一项常见的功能,用于允许用户上传图片、文档等各类文件到服务器。...同时,它们还提供了许多高级特性,如文件大小限制、进度条显示、断点续传等,这些都是现代Web应用中不可或缺的功能。

    WEB超大文件带进度条上传

    总结,Java实现"WEB超大文件带进度条上传"需要结合断点续传技术、分块上传策略、进度条更新机制以及合理的服务器配置。同时,考虑到性能和安全,需对上传过程进行优化和控制。在实际项目中,这通常涉及多层架构的...

    jsp上传功能实现模块

    **JSP上传功能实现模块详解** ...在实际项目中,根据具体需求,可能还需要考虑其他因素,如进度条显示、多文件上传、断点续传等。了解并掌握这些知识点,将有助于构建稳定、安全、高效的文件上传模块。

    java带进度条的文档上传

    本文将详细介绍如何使用AJAX、Apache Commons FileUpload和Apache Commons IO库来实现一个带有进度条的文档上传功能。 首先,Apache Commons FileUpload是一个用于处理HTTP请求中的多部分/表单数据的Java库,特别...

    java做的一个带进度条的文件上传小项目

    本项目是一个使用Java实现的带有进度条和取消功能的文件上传示例,它利用了Apache的Commons FileUpload库来处理文件上传的过程。Commons FileUpload是Java的一个开源组件,专门用于处理HTTP请求中的多部分/表单数据...

    jsp上传实现进度条

    另外,考虑使用断点续传技术,如果上传中断,用户可以从上次的位置继续上传,提高用户体验。 6. **错误处理**:处理可能出现的错误,如文件类型限制、上传失败等,并将错误信息反馈给用户。 7. **跨域问题**:如果...

    struts2单文件上传带进度条

    接下来,为了实现带有进度条的文件上传,我们需要在前端进行一些处理。通常,这会涉及HTML5的`&lt;input type="file"&gt;`元素和AJAX技术。通过监听`change`事件,当用户选择文件后,可以使用FormData对象将文件数据包装...

    java大文件上传

    总结来说,实现Java大文件上传结合`plupload`,主要涉及前端配置`plupload`参数,后端使用`Commons-FileUpload`处理分块上传,以及安全性、续传和服务器配置等多个方面。这个名为`pluploadTest`的项目应该包含了完整...

    FileUpload

    - **数据传输**:通过Ajax异步方式,将FormData对象发送到服务器,支持断点续传和进度反馈。 - **后端处理**:ServletFileUpload解析接收到的多部分数据,DiskFileItemFactory创建DiskFileItem实例,并将文件保存...

    上传文件fileupload+解决enctype= multipart/form-data无法传递其他参数

    9. **性能优化**:对于大文件上传,应考虑分块上传、进度条显示、断点续传等功能,以提高用户体验。同时,确保服务器有足够的存储空间和处理能力。 通过以上步骤,开发者可以有效地处理文件上传并同时传递其他参数...

    Java-文件上传与下载

    同时,为了提高用户体验,通常会提供进度条、断点续传等功能,这需要更深入的编程技巧和额外的库支持。总之,`Commons FileUpload`是一个强大的工具,可以帮助开发者轻松地处理Web应用中的文件操作。

    上传与下载

    下载时,提供断点续传功能,提高用户满意度。 以上是关于Java Web中文件上传与下载的基本知识,实际应用中可能需要结合具体业务需求和框架进行扩展和优化。通过熟练掌握这些技术,开发者可以构建出高效、安全的文件...

    带进度条的Struts2文件上传

    在Struts2中实现带进度条的文件上传是一项实用功能,能够提高用户体验,让用户在等待文件上传时能清晰地看到进度。 首先,我们需要了解文件上传的基本流程。在Struts2中,文件上传主要依赖于`Apache Commons ...

    mojolicious-stream-upload:mojolicious 实现的 stream 大文件上传的后端服务

    Stream 上传插件介绍 Stream 这个项目主要是为了解决大文件上传, 本程序只是它的一个 Perl 后端的...示例代码java实现(StreamServlet, FormDataServlet{commons-fileupload的stream api}, TokenServlet) 注:Chrome没

    java 上传多个文件

    7. **性能优化**:对于大文件上传,可以考虑分块上传和断点续传,以提高用户体验和系统性能。 通过以上步骤,你可以实现Java中的多文件上传功能,并结合前端技术实现进度条展示。`ahxu-commons-fileuploadex-beta2....

    struts做的文件的上传与下载

    同时,可以通过添加进度条、断点续传等功能提高用户体验。此外,可以考虑使用Spring MVC或其他现代框架替换Struts,以获得更好的性能和更丰富的功能支持。 总的来说,Struts实现文件上传与下载需要处理文件读写、...

Global site tag (gtag.js) - Google Analytics