话不多说直接上代码

 <%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script type="text/javascript" src="../3rd/jquery-3.2.1.min.js"></script> <style type="text/css"> .modelContent{
width: 380px;
height: 150px;
margin: 100px 200px;
background-color: #FFFFFF;
z-index: 1050;
position: absolute; } .hidden{
display: none;
} .content {
position: relative;
width: 350px;
margin: 30px 20px; } .txt {
height: 22px;
border: 1px solid #cdcdcd;
width: 180px;
vertical-align: middle;
margin: 0;
padding: 0
} .btn {
border: 1px solid #CDCDCD;
height: 24px;
width: 70px;
vertical-align: middle;
margin: 0;
padding: 0
} .file {
position: absolute;
top: 0;
left: 190px;
height: 24px;
filter: alpha(opacity : 0);
opacity: 0;
width: 70px;
vertical-align: middle;
margin: 0;
padding: 0
} .backdrop{
position: fixed;
z-index: 1040;
background-color: #333;
opacity: .5;
width: 100%;
height: 100%;
} .header{
padding: 15px;
border-bottom: 1px solid #e5e5e5;
} .close:focus, .close:hover {
color: #000;
text-decoration: none;
cursor: pointer;
opacity: .5;
} .close{
float: right;
margin-top: -9px;
} </style>
</head> <body>
<!-- 附于body之上的div -->
<div class="hidden backdrop" id="backDiv"></div> <!-- 定义上传按钮 -->
<button type="button" class="btn btn-default" title="导入" id="export">
</button> <!-- 定义上传对话框 -->
<div class="modelContent hidden" id="uploadDialog">
<!-- 标题 -->
<div class="header">
<span class="close">x</span>
</div>
<!-- 内容 -->
<div class="content">
<input type="text" id="textfield" class="txt" disabled="disabled"/>
<input type="button" class="btn" value="浏览..." />
<input type="file" name="file" class="file" id="file" multiple/>
<!-- onchange="document.getElementById('textfield').value=this.value" -->
<input type="submit" id="submit" class="btn" value="上传"/>
</div>
<!-- 上传进度条 -->
<div class="hidden" id="progressDiv" style="margin: 0px 15px;">
<progress id="progressbar" value="0" max="100" style="width: 308px;">
</progress>
<span id="percentage" style="color: blue;"></span>
</div>
</div>
</body> <script type="text/javascript">
$(function(){
$("#export").click(function(){
$("#uploadDialog,#backDiv").removeClass("hidden");
$("body").css("background-color","#fff");
}); //将选择的文件写到text中
$("#file").change(function(e){
var nameArray = [];
var files = $("#file")[0].files;
$.each(files,function(index,val){
nameArray.push(val.name);
});
$("#textfield").val(nameArray.join());
}) //关闭上传对话框
$(".close").click(function(e){
$("#uploadDialog,#backDiv").addClass("hidden");
$("#textfield").val("");
}); //点击上传,由于非form表单上传,因此采用
$("#submit").click(function(e){
//显示进度条
$("#progressDiv").show();
//获取上传文件
var fileObj = $("#file")[0].files[0];
console.log(fileObj);
//使用formdata实现无刷新上传
var formData = new FormData();
formData.append("file",fileObj);
//后台使用springmvc接收请求
var url = "http://localhost:8080/SpringMVCTest/index/fileUpload";
//ajax
var xhr = new XMLHttpRequest();
xhr.open("POST",url,true);
//定义上传对象的进度事件
xhr.upload.onprogress=function(event){
var progressBar = document.getElementById("progressbar") ;
var percentageDiv = document.getElementById("percentage");
if (event.lengthComputable) {
progressBar.max = event.total;
progressBar.value = event.loaded;
percentageDiv.innerHTML = Math.round(event.loaded / event.total * 100)+ "%";
}
}; // //当状态为4,
xhr.onload = function(event){
//获取相应的状态
var data = xhr.responseText;
//关闭进度条,并显示上传成功状态
// $("#progressDiv").addClass("hidden");
//
};
xhr.send(formData);
});
})
</script>
</html>

几点提示:

 1. 模态框的处理中必须增加一个影藏的div,设置其高、宽均为100%,当模态框显示时只需要其z-index的值大于背景div即可。

 2. post的请求体必须使用FormData来传递,否则后台无法接受到文件信息。

后台处理使用springmvc,务必注意以下几点,

 1. 在spring-mvc.xml中配置CommonsMultipartResolver的mutipart解析类

 <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="UTF-8"></property>
<property name="maxUploadSize" value="10485760000"></property>
<property name="maxInMemorySize" value="10240000"></property>
</bean>

 2. 如果需要进度条显示,则需要实现进度监听类ProgressListener

 package com.yongcheng.liuyang.listener;

 import javax.servlet.http.HttpSession;
import org.apache.commons.fileupload.ProgressListener;
import org.springframework.stereotype.Component; import com.yongcheng.liuyang.model.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);
}
public void update(long pBytesRead, long pContentLength, int pItems) {
Progress status = (Progress) session.getAttribute("status");
try {
Thread.sleep(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
status.setpBytesRead(pBytesRead);
status.setpContentLength(pContentLength);
status.setpItems(pItems); } }

3. 如果实现了进度监听接口,则需要将进度信息写到文件的解析类中,因此必须继承CommonsMultipartResolver,覆写parseRequest方法

 package com.yongcheng.liuyang.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;
} @Override
@SuppressWarnings("unchecked")
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);
}
}
}

 如有问题,欢迎评论留言,共同进步!!

js+ajax+springmvc实现无刷新文件上传的更多相关文章

  1. SpringMVC ajax技术无刷新文件上传下载删除示例

    参考 Spring MVC中上传文件实例 SpringMVC结合ajaxfileupload.js实现ajax无刷新文件上传 Spring MVC 文件上传下载 (FileOperateUtil.ja ...

  2. 【JS】ajax 实现无刷新文件上传

    一.摘要 最近在做个东西,需要实现页面无刷新文件上传,目前看到的方法有两种 1) 通过隐藏iframe 实现页面无刷新,适用于不关心上传结果 <form target="hiddenF ...

  3. Asp.Net实现无刷新文件上传并显示进度条(非服务器控件实现)(转)

    Asp.Net实现无刷新文件上传并显示进度条(非服务器控件实现) 相信通过Asp.Net的服务器控件上传文件在简单不过了,通过AjaxToolkit控件实现上传进度也不是什么难事,为什么还要自己辛辛苦 ...

  4. 使用PHP和HTML5 FormData实现无刷新文件上传教程

    无刷新文件上传是一个常见而又有点复杂的问题,常见的解决方案是构造 iframe 方式实现. 在 HTML5 中提供了一个 FormData 对象 API,通过 FormData 可以方便地构造一个表单 ...

  5. Asp.Net 无刷新文件上传并显示进度条的实现方法及思路

    相信通过Asp.Net的服务器控件上传文件在简单不过了,通过AjaxToolkit控件实现上传进度也不是什么难事,为什么还要自己辛辛苦苦来 实现呢?我并不否认”拿来主义“,只是我个人更喜欢凡是求个所以 ...

  6. 实用ExtJS教程100例-009:ExtJS Form无刷新文件上传

    文件上传在Web程序开发中必不可少,ExtJS Form中有一个filefield字段,用来选择文件并上传.今天我们来演示一下如何通过filefield实现ExtJS Form无刷新的文件上传. 首先 ...

  7. ie8实现无刷新文件上传

    ie8由于无法使用FormData,想要无刷新上传文件就显得比较麻烦.这里推荐使用jQuery-File-Upload插件,它能够很方便的解决ie8无刷新文件上传问题.(最低兼容到ie6) jQuer ...

  8. PHP Ajax JavaScript 实现 无刷新附件上传

    普通表单 前端页面 后台处理 带有文件的表单 刷新方式 前端界面 后台页面 无刷新方式 大文件上传 POST极值 upload极值 上传细节 前端页面 后台处理 总结 对一个网站而言,有一个基本的不可 ...

  9. 基于jQuery Ajax实现无刷新文件上传

    最近因项目需求更改,需要实现选择文件后即时上传至服务器,然后提交后,加载xls表格内容到jqgrid表格中,文件上传功能实现示例: 前端jsp页面: <form id="uploadF ...

随机推荐

  1. 【题解】 [ZJOI2006]书架 (Splay)

    懒得复制,戳我戳我 Solution: 还是一个\(Splay\),我们只用多存一个值\(rad\)来维护二叉树,然后用数组存下每个书对应的值是多少 \(Top\)操作,我是把\(s\)旋转到根节点, ...

  2. 学习Spring Boot:(十九)Shiro 中使用缓存

    前言 在 shiro 中每次去拦截请求进行权限认证的时候,都会去数据库查询该用户的所有权限信息, 这个时候就是有一个问题了,因为用户的权限信息在短时间内是不可变的,每次查询出来的数据其实都是重复数据, ...

  3. Nexus Repository Manager 3(CVE-2019-7238) 远程代码执行漏洞分析和复现

    0x00 漏洞背景 Nexus Repository Manager 3是一款软件仓库,可以用来存储和分发Maven,NuGET等软件源仓库.其3.14.0及之前版本中,存在一处基于OrientDB自 ...

  4. bzoj4542: [Hnoi2016]大数(莫队)

    这题...离散化...$N$和$n$搞错了...查了$2h$...QAQ 考虑$s[l...r]$,可以由两个后缀$suf[l]-suf[r+1]$得到$s[l...r]$代表的数乘$10^k$得到的 ...

  5. 解题:SHOI 2014 概率充电器

    题面 显然就是在求概率,因为期望乘的全是1....然后就推推推啊 设$fgg[i]$表示这个点父亲没给他充上电的概率,$sgg[i]$表示这个点子树(和它自己)没给他充上电的概率,然后这个点没充上电的 ...

  6. PyQt4 安装

    安装PyQt4很简单,从官网下载相应的安装包即可. 需要注意的是:应该根据你电脑上已经装好的python版本选择相应的PyQt4安装包. PyQt4的安装目录一定要选python的安装目录,比如我的P ...

  7. bzoj千题计划205:bzoj3529: [Sdoi2014]数表

    http://www.lydsy.com/JudgeOnline/problem.php?id=3529 有一张n*m的数表,其第i行第j列(1 < =i < =n,1 < =j & ...

  8. Excel VBA保护工作表

    '设定可编辑区域 ActiveSheet.Protection.AllowEditRanges.Add Title:="区域1", Range:=Range("E5:H1 ...

  9. 《Linux命令行与shell脚本编程大全》23章24章

    第二十三章 使用其他shell bash shell是linux发行版中最广泛使用的shell.但是它并不是唯一的选择,还有其他的shell可以供你选择. 23.1 什么是dash shell 百度百 ...

  10. Firefox滚动残影(转)

    Firefox滚动残影   Firefox滚动残影这文章放在草稿箱有一阵子了,之前的3系列都有这BUG,当正想发表这文章的时候,和我沟通刚刚升级的FF4已修复此BUG,所以搁置一阵在考虑到这文章还有没 ...