使用Ajax异步上传文件

之前上传文件都是用表单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);
    }
原文地址:https://www.cnblogs.com/lz2017/p/8820782.html