之前上传文件都是用表单form设置post请求和enctype类型:

<form id="upload_form"action="" method="post" enctype="multipart/form-data">

提交按钮是一个submit类型的input,提交给后台进行处理。现在记录一下使用Ajax上传文件的步骤。

1.如果需要上传的文件域还是在一个表单中,但是该表单没有使用submit提交。

那么推荐使用Ajax表单插件(jquery.form.js),这款插件直接就支持文件的上传。我们直接使用它的ajaxForm方法即可(不要忘了引入这个插件):

            $('#btn').click(function(){
$('#upload_form').ajaxForm({
beforeSubmit:function(){
var file=$("#file")[0].files[0];
if(file==null){
return false;
}
var filesize = file.size/1024/1024;
if(filesize > 10){
console.log('文件大小超过限制,最多10M');
return false;
}
},
uploadProgress: function(event, position, total, percentComplete) {//上传的过程
//position 已上传了多少
//total 总大小
//percentComplete已上传的百分数
},
success: function(data) {
},
error:function(err){//失败
}
}); });

btn就是一个普通的button,upload_form是这个表单的id,file是文件域的id。我在beforeSubmit回调函数里判断上传文件的大小,如果大于10M不允许上传,uploadProgress回调函数中可以得到当前上传的进度信息。

还有更多的回调函数可以参看该插件的文档:https://github.com/jquery-form/form

2.如果上传域不在一个表单中,我们可以使用formdata对象来处理:

        var formData = new FormData();
var name = $('#user_id').val();
formData.append("lunwen",$("#file")[0].files[0]);
formData.append("userId",name);
$.ajax({
url : '',
type : 'POST',
data : formData,
// 告诉jQuery不要去处理发送的数据
processData : false,
// 告诉jQuery不要去设置Content-Type请求头
contentType : false,
beforeSend:function(){
console.log("正在进行,请稍候");
},
success : function(responseStr) {console.log("error")}
            error : function(responseStr) { console.log("error"); } });

file依然是文件域,我们还可以将其他的数据都append进formData对象中

最后,我在这里贴一个后台Controller处理文件上传的代码:

    @ResponseBody
@RequestMapping(value="/updateInfo",method=RequestMethod.POST)
public boolean updateStudentInfo(User user,
@RequestParam(value="portrait",required=false)MultipartFile portrait,HttpServletRequest request) {
if(portrait!=null&&portrait.getSize()>0) {
if(portrait.getSize()>(10*1024*1024)) {
return false;
}
String filename=portrait.getOriginalFilename();
String dbPath=request.getServletContext().getContextPath()+"/portrait/"+user.getUserId();
String basePath=request.getServletContext().getRealPath("/portrait/"+user.getUserId());
new File(basePath).mkdir();
File portraitFile=new File(basePath,filename);
try {
portrait.transferTo(portraitFile);
user.setUserPortrait(dbPath+"/"+filename);
return userService.updateUserInfo(user);
} catch (Exception e) {
e.printStackTrace();
} }
return userService.updateUserInfo(user);
}

使用Ajax异步上传文件的更多相关文章

  1. ajax异步上传文件和表单同步上传文件 的区别

    1. 用表单上传文件(以照片为例)-同步上传 html部分代码:这里请求地址index.php <!DOCTYPE html> <html lang="en"&g ...

  2. 基于Flask开发网站 -- 前端Ajax异步上传文件到后台

    大家好,我是辰哥~ 辰哥最近利用空闲时间在写一个在线可视化平台,过程中也觉得一些技术还是比较有意思的,所以就以模块化的形式分享出来.如:从网页界面(前端)上传文件到服务器(后端). 放一下该模块的界面 ...

  3. Spring使用ajax异步上传文件

    单文件上传 <!-- 创建文件选择框 --> 文件上传 :<input type="file" id="file" name="fi ...

  4. ajax异步上传文件FormDate方式,html支持才可使用

    今天需要做一个头像的预览功能,所以我想到了异步上传文件. 总结几点: 异步上传难点: 文件二进制流如何获取 是否需要设置表单的头,就是content-Type那里.异步,所以无所谓了吧. 其他就差不多 ...

  5. 使用ajax异步上传文件或图片(配合php)

    //html代码 <form enctype="multipart/form-data" id="upForm"> <input type=& ...

  6. Ajax 异步上传文件

    需要引用js jquery.form 前端代码 <form action="/Save" id="mainForm" method="post& ...

  7. ajax异步上传文件之data参数----小哈学js

    下载ajaxFileUpload.js(下载网址:http://fileuploadajax.codeplex.com/downloads/get/20976) 修改ajaxFileUpload.js ...

  8. html5+php实现文件的断点续传ajax异步上传

    html5+php实现文件的断点续传ajax异步上传 准备知识:断点续传,既然有断,那就应该有文件分割的过程,一段一段的传.以前文件无法分割,但随着HTML5新特性的引入,类似普通字符串.数组的分割, ...

  9. (H5)FormData+AJAX+SpringMVC跨域异步上传文件

    最近都没时间整理资料了,一入职就要弄懂业务,整天被业务弄得血崩. 总结下今天弄了一个早上的跨域异步上传文件.主要用到技术有HTML5的FormData,AJAX,Spring MVC. 首先看下上传页 ...

随机推荐

  1. pig 自定义udf中读取hdfs 文件

    最近几天,在研究怎么样把日志中的IP地址转化成具体省份城市. 希望写一个pig udf IP数据库采用的纯真IP数据库文件qqwry.dat,可以从http://www.cz88.net/下载. 这里 ...

  2. oracle的JOB

    前文再续,上面说的oracle的JOB,近期有些体会,记录一下: 零.创建JOB 创建JOB 1)创建一个存储过程.逻辑处理都在这个存储过程里面. 2)创建一个JOB运行此存储过程 -- 创建tabl ...

  3. [AOP] 7. 一些自定义的Aspect - Circuit Breaker

    Circuit Breaker(断路器)模式 关于断路器模式是在微服务架构/远程调用环境下经常被使用到的一个模式.它的作用一言以蔽之就是提高系统的可用性,在出现的问题通过服务降级的手段来保证系统的整体 ...

  4. Vim技能修炼教程(2) - 语法高亮速成

    语法高亮速成 我们继续在人间修行Vim技能之旅.上一次我们学习了如何通过vundle安装插件,这次我们迅速向写插件的方向挺进. 我们先学习一个最简单的语法高亮插件的写法. 语法高亮基本上是由三部分组成 ...

  5. JMter参数化

    参数化是干嘛的呢,咱们在调用接口的时候,有入参,那参数里面的值如果经常变化的话,就得每次去改了,很麻烦,这时候咱们就把需要经常变的值,改成可以变化的或者是咱们提前设置好的一些值,这样的话,调用的时候就 ...

  6. angularjs 阻止浏览器自带的回退

    $scope.$on('$locationChangeStart', function(e) { if(!tfOrder && comm.getStorage('orederlistL ...

  7. with异常

    with 语句 语法: with 表达式1 [as 变量1], 表达式2 [as 变量2], ...: 语句块 作用: 使用于对资源进行访问的场合,确保使用过程中不管是否发生异常都会执行必要的'清理操 ...

  8. java区分绝对路径和相对路径

    java区分绝对路径和相对路径 这里要区分的是目录路径 如: /opt/deve/tomcat/bin c:\deve\tomcat\bin 都是绝对目录路径 bin bin/data bin\dat ...

  9. Java并发--进程与线程由来

    下面是本文的目录大纲: 一.操作系统中为什么会出现进程? 二.为什么会出现线程? 三.多线程并发 一.操作系统中为什么会出现进程? 说起进程的由来,我们需要从操作系统的发展历史谈起. 也许在今天,我们 ...

  10. 转:Excel导入SQL数据库完整代码

    Excel导入SQL数据库完整代码 protected void studentload_Click(object sender, EventArgs e) {//批量添加学生信息 SqlConnec ...