-
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个答案 按时间排序 按投票排序
-
他是一个封装的组件,我们不需要看到他的代码的,他们的相关的控制都可以通过JavaScript来修改的
在他的附属JS里面可以修改:提示语、文件大小限制、要提交文件事哪等;可以通过CSS来修改展现样式等2011年11月21日 09:51
-
使用commons-fileupload实现断点续传不好的,原因如下:
1、断点续传原理:首先获取文件的整个长度,然后查询已经上传了多少长度,下次读取的时候从上传完成的部分开始读取(复杂的还有文件分片等)
2、js无法获取本地硬盘上的文件信息,所以他不能从指定的大小位置可始读取文件,这个只有每次都是重新上传,这样的断点续传也没意义
建议使用flash组件进行上传,可以看一下swfupload这个组件,实现进度条等也非常方便2011年11月14日 18:25
相关推荐
2. 支持断点续传:允许用户在上传过程中暂停并重新开始,避免因网络问题导致整个文件需要重新上传。 3. 错误处理:库提供了丰富的异常处理机制,帮助开发者捕获和处理可能出现的问题。 4. 自定义存储策略:你可以...
在Java Web开发中,文件上传是一项常见的功能,用于接收用户通过网页上传的文件,例如...在实际开发中,还需要关注文件安全性问题,如防止文件注入攻击,以及优化大文件上传的性能,比如使用异步上传或断点续传技术。
本篇文章将详细讲解如何结合Apache Commons FileUpload和XMLHttpRequest实现带进度条的文件上传功能。 首先,我们需要理解Apache Commons FileUpload的工作原理。这个库解析HTTP请求中的multipart/form-data内容,...
在Java Web开发中,文件上传是一项常见的功能,用于允许用户上传图片、文档等各类文件到服务器。...同时,它们还提供了许多高级特性,如文件大小限制、进度条显示、断点续传等,这些都是现代Web应用中不可或缺的功能。
总结,Java实现"WEB超大文件带进度条上传"需要结合断点续传技术、分块上传策略、进度条更新机制以及合理的服务器配置。同时,考虑到性能和安全,需对上传过程进行优化和控制。在实际项目中,这通常涉及多层架构的...
**JSP上传功能实现模块详解** ...在实际项目中,根据具体需求,可能还需要考虑其他因素,如进度条显示、多文件上传、断点续传等。了解并掌握这些知识点,将有助于构建稳定、安全、高效的文件上传模块。
本文将详细介绍如何使用AJAX、Apache Commons FileUpload和Apache Commons IO库来实现一个带有进度条的文档上传功能。 首先,Apache Commons FileUpload是一个用于处理HTTP请求中的多部分/表单数据的Java库,特别...
本项目是一个使用Java实现的带有进度条和取消功能的文件上传示例,它利用了Apache的Commons FileUpload库来处理文件上传的过程。Commons FileUpload是Java的一个开源组件,专门用于处理HTTP请求中的多部分/表单数据...
另外,考虑使用断点续传技术,如果上传中断,用户可以从上次的位置继续上传,提高用户体验。 6. **错误处理**:处理可能出现的错误,如文件类型限制、上传失败等,并将错误信息反馈给用户。 7. **跨域问题**:如果...
接下来,为了实现带有进度条的文件上传,我们需要在前端进行一些处理。通常,这会涉及HTML5的`<input type="file">`元素和AJAX技术。通过监听`change`事件,当用户选择文件后,可以使用FormData对象将文件数据包装...
总结来说,实现Java大文件上传结合`plupload`,主要涉及前端配置`plupload`参数,后端使用`Commons-FileUpload`处理分块上传,以及安全性、续传和服务器配置等多个方面。这个名为`pluploadTest`的项目应该包含了完整...
- **数据传输**:通过Ajax异步方式,将FormData对象发送到服务器,支持断点续传和进度反馈。 - **后端处理**:ServletFileUpload解析接收到的多部分数据,DiskFileItemFactory创建DiskFileItem实例,并将文件保存...
9. **性能优化**:对于大文件上传,应考虑分块上传、进度条显示、断点续传等功能,以提高用户体验。同时,确保服务器有足够的存储空间和处理能力。 通过以上步骤,开发者可以有效地处理文件上传并同时传递其他参数...
同时,为了提高用户体验,通常会提供进度条、断点续传等功能,这需要更深入的编程技巧和额外的库支持。总之,`Commons FileUpload`是一个强大的工具,可以帮助开发者轻松地处理Web应用中的文件操作。
下载时,提供断点续传功能,提高用户满意度。 以上是关于Java Web中文件上传与下载的基本知识,实际应用中可能需要结合具体业务需求和框架进行扩展和优化。通过熟练掌握这些技术,开发者可以构建出高效、安全的文件...
在Struts2中实现带进度条的文件上传是一项实用功能,能够提高用户体验,让用户在等待文件上传时能清晰地看到进度。 首先,我们需要了解文件上传的基本流程。在Struts2中,文件上传主要依赖于`Apache Commons ...
Stream 上传插件介绍 Stream 这个项目主要是为了解决大文件上传, 本程序只是它的一个 Perl 后端的...示例代码java实现(StreamServlet, FormDataServlet{commons-fileupload的stream api}, TokenServlet) 注:Chrome没
7. **性能优化**:对于大文件上传,可以考虑分块上传和断点续传,以提高用户体验和系统性能。 通过以上步骤,你可以实现Java中的多文件上传功能,并结合前端技术实现进度条展示。`ahxu-commons-fileuploadex-beta2....
同时,可以通过添加进度条、断点续传等功能提高用户体验。此外,可以考虑使用Spring MVC或其他现代框架替换Struts,以获得更好的性能和更丰富的功能支持。 总的来说,Struts实现文件上传与下载需要处理文件读写、...