spring MVC + bootstrap实现文件上传示例(带进度条)

时间:2022-03-30 04:37:31

最近学习了bootstrap,有结合了spring MVC写了个文件上传的示例,留做笔记,废话不多说,直接上代码

监听器类FileUploadProgressListener.Java

?
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
package com.gpl.web.listener; 
import javax.servlet.http.HttpSession;
 
import org.apache.commons.fileupload.ProgressListener;
import org.springframework.stereotype.Component;
 
import com.gpl.web.utils.Progress;
 
 
@Component
public 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);
  }
 
}

CustomerMyltipartResolver.java

?
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
package com.gpl.web.listener; 
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;
 
public class CustomMultipartResolver extends CommonsMultipartResolver{
   
  @Autowired
  private FileUploadProgressListener progressListener;
   
  public void setFileUploadProgressListener(FileUploadProgressListener progressListener){
    this.progressListener = progressListener;
  }
   
  public MultipartParsingResult parsingResult(HttpServletRequest request){
    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 e) {
      throw new MultipartException("异常",e);
    }
  }
 
}

进度实体类Progress.java

?
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
package com.gpl.web.utils;
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 + "]";
  }
   
   
}

spring配置文件需加入如下bean

?
1
2
3
4
5
<!-- 文件上传 -->
  <bean id="multipartResolver" class="com.gpl.web.listener.CustomMultipartResolver">
    <property name="defaultEncoding" value="utf-8"></property>
    <property name="maxUploadSize" value="838860800"></property>
  </bean>

controller层实现

?
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
/**
   * 文件上传
   * @param request
   * @param response
   * @param file
   * @throws IOException
   */
  @RequestMapping(value = "/upload", method = RequestMethod.POST)
  public void upload(HttpServletRequest request,HttpServletResponse response,@RequestParam("file") CommonsMultipartFile file)
      {
    try{
      PrintWriter out;
      boolean flag = false;
      if(file.getSize() > 0){
        String path = "/asserts/upload/files/excel/";
        String uploadPath = request.getSession().getServletContext().getRealPath(path);
        System.out.println(uploadPath);
        FileUtils.copyInputStreamToFile(file.getInputStream(), new File(uploadPath,file.getOriginalFilename()));
        flag = true;
      }
      out = response.getWriter();
      if(flag == true){
        out.print("1");
      }else{
        out.print("2");
      }
    }catch(Exception e){
      e.printStackTrace();
    }
     
  }

前端代码

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<div id="uploadFileDlg" class="easyui-dialog" style="width:800px;text-align:center;"
      closed="true">
      <form id="uploadFileForm" method="post" style="width:100%;text-align:center;padding:20px 0;">
        <input id="file" type="file" style="width:500px;display:inline-block;">
        <button id="uploadBtn" class="easyui-linkButton" style="width:auto;display:inline-block;">上传</button
      </form>
      <div class="progress progress-bar-striped active" style="display:none;">
        <div id="progressBar" class="progress-bar progress-bar-info" role="progressbar"
        aria-valuenow="0" aria-valuemin="0" aria-valuemax="100"
        style="width:0%;">
        </div>
      </div>
      <table id="uploadBatchDg"></table>
    </div>

页面ready加入的js代码

?
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
$("#uploadBtn").attr("disabled",false);
    $("#uploadBtn").click(function(){
      var fileValue = $("#file").val();
      if(fileValue == null || fileValue == ""){
        layer.msg("请先选择文件");
        return;
      }
      var obj = $("#file");
      var photoExt=obj.val().substr(obj.val().lastIndexOf(".")).toLowerCase();//获得文件后缀名
      if(photoExt!=".xls" && photoExt!=".xlsx"){
        layer.msg("请选择xls或是xlsx格式的文件,不支持其他格式文件");
        return false;
      }
      var fileSize = 0;
      var isIE = /msie/i.test(navigator.userAgent) && !window.opera;   
      if (isIE && !obj.files) {   
        var filePath = obj.val();   
        var fileSystem = new ActiveXObject("Scripting.FileSystemObject"); 
        var file = fileSystem.GetFile (filePath);    
        fileSize = file.Size;   
      }else
        fileSize = obj.get(0).files[0].size;  
      
      fileSize=Math.round(fileSize/1024*100)/100; //单位为KB
      if(fileSize > 5000){
        layer.msg("文件不能大于5M");
        return false;
      }
      $("#progressBar").width("0%");
      $(this).attr("disabled",true);
      $("#progressBar").parent().show();
      $("#progressBar").parent().addClass("active");
      uploadFile();

上传文件js代码

?
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
function uploadFile() {
      var fileObj = $("#file").get(0).files[0]; // js 获取文件对象
      console.info("上传的文件:"+fileObj);
      var FileController = "${basePath}/batch/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() {
        layer.msg("上传完成");
        $("#uploadBtn").attr('disabled', false);
        $("#uploadBtn").val("上传");
        $("#progressBar").parent().removeClass("active");
        $("#progressBar").parent().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);
        $("#uploadBtn").val("正在上传 " + completePercent);
      }
    };

效果图

spring MVC + bootstrap实现文件上传示例(带进度条)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:http://blog.csdn.net/wyccyw123456/article/details/52396449