背景
想做一个带进度条的文件上传,可是搜索的结果都不是很满意,最后参考一个实践了一下,基于SpringMVC实现,前端采用Bootstrap。
整理一下进度条的实现。
效果
先看最后的效果
实现步骤
前提
SpringMVC已经配置好了
第一步
写一个进度条pojo
Progress.java
/** * 进度条 * @author 程高伟 * * @date 2016年7月5日 上午9:51:47 */public class Progress { private long bytesRead; private long contentLength; private long items; public long getBytesRead() { return bytesRead; } public void setBytesRead(long bytesRead) { this.bytesRead = bytesRead; } public long getContentLength() { return contentLength; } public void setContentLength(long contentLength) { this.contentLength = contentLength; } public long getItems() { return items; } public void setItems(long items) { this.items = items; } @Override public String toString() { return "Progress [bytesRead=" + bytesRead + ", contentLength=" + contentLength + ", items=" + items + "]"; }}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
第二步 实现ProgressListener
依赖的jar包
<dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.1</version></dependency><dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.5</version></dependency>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
FileUploadProgressListener.java
import javax.servlet.http.HttpSession;import org.apache.commons.fileupload.ProgressListener;import org.springframework.stereotype.Component;import com.cdpts.wechat.model.Progress;@Componentpublic class FileUploadProgressListener implements ProgressListener { private HttpSession session; public void setSession(HttpSession session){ this.session=session; Progress status = new Progress();//保存上传状态 session.setAttribute("status", status); } @Override public void update(long bytesRead, long contentLength, int items) { Progress status = (Progress) session.getAttribute("status"); status.setBytesRead(bytesRead); status.setContentLength(contentLength); status.setItems(items); }}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
第三步 继承CommonsMultipartResolver
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.cdpts.wechat.service.FileUploadProgressListener;public class CustomMultipartResolver extends CommonsMultipartResolver { // 注入第二步写的FileUploadProgressListener @Autowired private FileUploadProgressListener progressListener; public void setFileUploadProgressListener(FileUploadProgressListener progressListener) { this.progressListener = progressListener; } @Override public MultipartParsingResult parseRequest(HttpServletRequest request) throws MultipartException { String encoding = determineEncoding(request); FileUpload fileUpload = prepareFileUpload(encoding); progressListener.setSession(request.getSession()); fileUpload.setProgressListener(progressListener); try { List<FileItem> 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); } }}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
第四步
在springmvc的配置文件中配置第三步的CustomMultipartResolver
<bean id="multipartResolver" class="com.cdpts.wechat.utils.spring.CustomMultipartResolver"/>
- 1
- 2
第五步
编写Controller
// 处理上传的 @RequestMapping("/upload") public void upload(HttpServletRequest request, HttpServletResponse response, @RequestParam("file") CommonsMultipartFile file) throws IOException { PrintWriter out; boolean flag = false; if (file.getSize() > 0) { String path = "/assets/upload/files/"; String uploadPath = request.getSession().getServletContext().getRealPath(path); try { FileUtils.copyInputStreamToFile(file.getInputStream(), new File(uploadPath, file.getOriginalFilename())); flag = true; } catch (Exception e) { } } out = response.getWriter(); if (flag == true) { out.print("1"); } else { out.print("2"); } }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
第六步 开发页面
需要bootstrap
html部分
<!-- Modal --><div id="batchImportModal" class="modal fade" role="dialog" aria-labelledby="gridSystemModalLabel"> <div class="modal-dialog"> <div class="modal-content"> <div class="modal-header"> <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> <h4 class="modal-title" id="myModalLabel">批量导入用户</h4> </div> <div class="modal-body"> <div class="form-group" id="passwordDiv"> <label>选择用户数据文件</label> <input class="form-control" type="file" id="batchFile"> </div> <div class="progress progress-striped active" style="display: none"> <div id="progressBar" class="progress-bar progress-bar-info" role="progressbar" aria-valuemin="0" aria-valuenow="0" aria-valuemax="100" style="width: 0%"> </div> </div> <div class="form-group"> <input id="batchUploadBtn" type="submit" name="submit" class="btn btn-success" value="上传" /> </div> </div> </div> <!-- /.modal-content --> </div> <!-- /.modal-dialog --></div><!-- /.modal -->
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
JavaScript部分
$(function() { // 批量导入按钮 $("#batchImportBtn").click(function(){ $('#batchImportModal').modal('show'); }) var base = $("#base").val().trim(); // 上传按钮 $("#batchUploadBtn").attr('disabled', true); // 上传文件按钮点击的时候 $("#batchUploadBtn").click(function() { // 进度条归零 $("#progressBar").width("0%"); // 上传按钮禁用 $(this).attr('disabled', true); // 进度条显示 $("#progressBar").parent().show(); $("#progressBar").parent().addClass("active"); // 上传文件 UpladFile(); }) // 文件修改时 $("#batchFile").change(function() { $("#batchUploadBtn").val("上传"); $("#progressBar").width("0%"); var file = $(this).prop('files'); if (file.length != 0) { $("#batchUploadBtn").attr('disabled', false); } }); function UpladFile() { var fileObj = $("#batchFile").get(0).files[0]; // js 获取文件对象 console.info("上传的文件:"+fileObj); var FileController = base + "/admin/user/upload"; // 接收上传文件的后台地址 // FormData 对象 var form = new FormData(); // form.append("author", "hooyes"); // 可以增加表单数据 form.append("file", fileObj); // 文件对象 // XMLHttpRequest 对象 var xhr = new XMLHttpRequest(); xhr.open("post", FileController, true); xhr.onload = function() { // ShowSuccess("上传完成"); alert("上传完成"); $("#batchUploadBtn").attr('disabled', false); $("#batchUploadBtn").val("上传"); $("#progressBar").parent().removeClass("active"); $("#progressBar").parent().hide(); //$('#myModal').modal('hide'); }; xhr.upload.addEventListener("progress", progressFunction, false); xhr.send(form); } ; function progressFunction(evt) { var progressBar = $("#progressBar"); if (evt.lengthComputable) { var completePercent = Math.round(evt.loaded / evt.total * 100)+ "%"; progressBar.width(completePercent); $("#batchUploadBtn").val("正在上传 " + completePercent); } };}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
我写了一个简单的开源项目,项目中有一个带进度条的文件上传
效果图如下
开源项目github地址,如果觉得可以别忘了给个star哦。
数据库脚本地址
https://github.com/peer44/java-rbac/blob/master/jrbac/src/main/resources/sql/jrbac.sql