之前上传文件都是用表单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);
}

最新文章

  1. 【转】超实用PHP函数总结整理
  2. ADAS技术应用
  3. Redis是什么?Redis数据库全解?
  4. WinSock IO模型 -- WSAEventSelect模型事件触发条件说明
  5. 【转】GitHub问题之恢复本地被删除的文件
  6. 《Windows驱动开发技术详解》之Windows内核函数
  7. jq中的表单验证插件------jquery.validate
  8. Codeforces Round #443 (Div. 1) C. Tournament
  9. class的真相
  10. Oracle笔记----oracle数字类型number自增
  11. linux 提高代码质量的工具
  12. Day 1: ASP.NET and JavaScript Jan.16th Trying
  13. Linux查看日志常用命令
  14. 自己用图片做的可旋转、不确定进度的ProgressBar
  15. HEVC (H.265)介绍(转)
  16. Flip Game---poj1753(状压+bfs)
  17. Daily Scrum2 11.4
  18. eschop购物实现立即购买和加入购物车
  19. 输入一个long类型的整数,输出一个以金融格式表示的字符串
  20. Django Meta

热门文章

  1. Hibernate主键生成策略详解
  2. 安装visio 2010:您的计算机上的Office 2003安装已损坏,安装程序无法继续。请删除或修复office 2003产品并重新运行安装程序
  3. Android版本的"Wannacry"文件加密病毒样本分析(附带锁机)
  4. UE4 Sequencer的事件调用
  5. windows 10 安装 sql 2005 安装失败
  6. C语言变量、函数的作用域及变量的存储方式
  7. CSS琐碎[1]
  8. BZOJ5450: 轰炸(水题,Tarjan缩点求最长路)
  9. 前端(四):JavaScript面向对象之自定义对象
  10. RSA 每次公钥加密不同结果