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

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

监听器类FileUploadProgressListener.Java

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

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

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

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

controller层实现

/**
   * 文件上传
   * @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();
    } 

  }

前端代码

<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代码

$("#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代码

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);
      }
    };

效果图

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

时间: 2017-02-28

BootStrap Progressbar 实现大文件上传的进度条的实例代码

1.首先实现大文件上传,如果是几兆或者几十兆的文件就用基本的上传方式就可以了,但是如果是大文件上传的话最好是用分片上传的方式.我这里主要是使用在客户端进行分片读取到服务器段,然后保存,到了服务器段读取完了之后将分片数据进行组合. 2.前端代码如下: <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="UploadTest2.aspx.cs" Inherits="Htm

Bootstrap自定义文件上传下载样式

在平时工作中,文件上传下载功能属于不可或缺的一部分.bootstrap前端样式框架也使用的比较多,现在根据bootstrap强大的样式模板,自定义一种文件下载的样式. 后续会使用spring MVC框架实现文件上传的全部代码,敬请期待. 先看图片示例: 本示例包括下载样本文件样式和上传文件样式. 直接先上代码,最后讲解: <div class="form-group col-md-12 has-feedback" id="file"> <label

Bootstrap fileinput文件上传预览插件使用详解

介绍 通过本文,你可以学习到如何封装或者开发一个前端组件,同时学习Bootstrap-fileinput组件的使用,封装后使用更加简单方便. BaseFile是AdminEAP框架中基于Bootstrap-fileinput的附件上传组件,它支持 支持多文件.在线预览.拖拽上传等功能,封装后BaseFile主要包括以下功能: 弹出窗口的附件上传 当前界面的附件上传 显示附件明细 可编辑的附件明细(删除.预览.不可新增) 关于Bootstrap-fileinput的API文档可参考http://p

JS文件上传神器bootstrap fileinput详解

Bootstrap FileInput插件功能如此强大,完全没有理由不去使用,但是国内很少能找到本插件完整的使用方法,于是本人去其官网翻译了一下英文说明文档放在这里供英文不好的同学勉强查阅.另外附上一段调用方发和servlet端的接收代码,未完待续. 引言: 一个强化的HTML5 文件输入插件,适用于Bootstrap 3.x.本插件对多种类型的文件提供文件预览,并且提供了多选等功能.本插件还提供给你一个简单的方式去安装一个先进的文件选择/上传控制版本去配合Bootstrap CSS3样式.通过

基于BootStrap Metronic开发框架经验小结【五】Bootstrap File Input文件上传插件的用法详解

Bootstrap文件上传插件File Input是一个不错的文件上传控件,但是搜索使用到的案例不多,使用的时候,也是一步一个脚印一样摸着石头过河,这个控件在界面呈现上,叫我之前使用过的Uploadify 好看一些,功能也强大些,本文主要基于我自己的框架代码案例,介绍其中文件上传插件File Input的使用. 1.文件上传插件File Input介绍 这个插件主页地址是:http://plugins.krajee.com/file-input,可以从这里看到很多Demo的代码展示:http:/

Bootstrap文件上传组件之bootstrap fileinput

前言:之前的三篇介绍了下bootstrap的一些常用组件,发现博主对这种扁平化的风格有点着迷了.前两天做一个excel导入的功能,前端使用原始的input type='file'这种标签,效果不忍直视,于是博主下定决心要找一个好看的上传组件换掉它.既然bootstrap开源,那么社区肯定有很多关于它的组件,肯定也有这种常见的上传组件吧.经过一番查找,功夫不负有心人,还是被博主找到了这个组件:bootstrap fileinput.在此记录下,就算做个学习笔记,也给需要使用的朋友提供点方便. Bo

BootStrap实现文件上传并带有进度条效果

1.做了一天终于做出来了,在上传成功之后,可以将路径添加到数据库,因为一直在烦恼如何在上传成功之后在将路径添加到数据库,终于弄出来了,太开心了,不得不说bootstrap的强大,之前说ajax不能上传文件,之后想办法,用js写,更改了上传文件按钮的样式,但是没想到bootstrap真的太厉害了,样式还不错,可以预览,图片,限制文件的大小,格式等等,还有进度条. 后台的代码在之前写过了 这只有前台的代码 记得:在验证的时候,尽量用控制台来验证,有的时候你的代码写对了,但是有可能alert不显示 c

BootStrap fileinput.js文件上传组件实例代码

1.首先我们下载好fileinput插件引入插件 <span style="font-size:14px;"><link type="text/css" rel="stylesheet" href="fileinput/css/fileinput.css" rel="external nofollow" /> <script type="text/javascript

BootStrap 实现各种样式的进度条效果

Bootstrap提供了各式各样的进度条效果,下面通过实例代码给大家详细介绍,具体详情如下所示: 看下面的例子: <!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1&quo

Bootstrap每天必学之进度条

1.进度条 在网页中,进度条的效果并不少见,比如一个评分系统,比如加载状态等.就如下图所示的一个评分系统,他就是一个简单的进度条效果: 进度条和其他独立组件一样,开发者可以根据自己的需要,选择对应的版本: ☑ LESS版本:源码文件progress-bars.less ☑ Sass版本:源码文件_progress-bars.scss ☑ 编译后版本:bootstrap.css文件第4500行-第4575行 而且Bootstrap框架为大家提供多种样式风格的进度条,供大家使用. 2.进度条–基本样

bootstrap+jQuery实现的动态进度条功能示例

本文实例讲述了bootstrap+jQuery实现的动态进度条功能.分享给大家供大家参考,具体如下: 此款进度条实现的功能: 1.利用了bootstrap的进度条组件. a.在最外层的<div>中加入class .progress,在里层<div>加入class .progress-bar从而实现基本的进度条. b.在外层<div>中加入class .progress-striped实现条纹进度条. c.在内层<div>加入class .progress-b

jQuery实现的进度条效果

在某些特定的场景下,应用进度条效果,可以提高网站的人性化程度,能够让用户能够掌握进度,增加对进度的耐心,否则可能直接导致关闭页面,从来导致网站流失用户,下面就是用过jQuery实现的进度效果代码. <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>我们</title> <script src="http://libs.baidu.

jQuery实现进度条效果代码

在某些特定的场景下,应用进度条效果,可以提高网站的人性化程度,能够让用户能够掌握进度,增加对进度的耐心,否则可能直接导致关闭页面,从来导致网站流失用户,下面就是用过jQuery实现的进度效果代码. <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta nam

struts2实现文件上传显示进度条效果

一. struts2读取进度原理分析(作为草稿存了好久,刚刚发布出来......) 1. 在strut2中控制文件上传信息的类是实现MultiPartRequest接口的JakartaMultiPartRequest 其实第一次看到源文件时我打了个退堂鼓,因为觉得内容太长了,不想看.冷静下来将思路理顺,将分开的各个方法还原到一个方方中中,发现还是很好理解的: @Override public void parse(HttpServletRequest request, String saveDi

Android 自定义view和属性动画实现充电进度条效果

近期项目中需要使用到一种类似手机电池充电进度的动画效果,以前没学属性动画的时候,是用图片+定时器的方式来完成的,最近一直在学习动画这一块,再加上复习一下自定义view的相关知识点,所以打算用属性动画和自定义view的方式来完成这个功能,将它开源出来,供有需要的人了解一下相关的内容. 本次实现的功能类似下面的效果: 接下来便详细解析一下如何完成这个功能,了解其中的原理,这样就能举一反三,实现其他类似的动画效果了. 详细代码请看大屏幕 https://github.com/crazyandcoder

Android开发之模仿微信打开网页的进度条效果(高仿)

一,为什么说是真正的高仿? 阐述这个问题前,先说下之前网上的,各位可以复制这段字,去百度一下  "仿微信打开网页的进度条效果" ,你会看到有很多类似的文章,不过他们有个共同点,就是实现方法都是一样的,而且,都忽略了微信加载网页时,进度条的缓慢动画效果,它不是生硬地一滑而过,而是用户体验很好,有个速度的变化,由慢到快的效果,语言难于描述,相信各位都有下载微信,可以随便打开个公众号的文章看看效果. 好了,上面说到,之前网上的方法都是都忽略了微信加载网页时,进度条的缓慢动画效果,实现代码也是

Android编程实现通知栏进度条效果的方法示例

本文实例讲述了Android编程实现通知栏进度条效果的方法.分享给大家供大家参考,具体如下: /** * 通知管理工具类 * * @description: * @author ldm * @date 2016-5-3 上午9:39:56 */ public class NotificationUtil { private Context mContext; // NotificationManager : 是状态栏通知的管理类,负责发通知.清楚通知等. private Notification