zoukankan      html  css  js  c++  java
  • 使用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);
        }
  • 相关阅读:
    iOS 疑难杂症 — — 复制 Storyborad 莫名崩溃
    【Swift 2.1】共享文件操作小结(iOS 8 +)
    【Swift】 应用内显示 AppStore 某个应用的详情
    【Swift】iOS开发笔记(一)
    【Swift 2.0】实现简单弹幕功能
    站长名站
    Future home of something quite cool.
    大神们都在用的两个国外的免费离线下载:Rain&amp; LoadBT
    Amazon Publisher Studio让产品推广更简单
    人脉是设计出来的,进入高端人脉圈的方法
  • 原文地址:https://www.cnblogs.com/lz2017/p/8820782.html
Copyright © 2011-2022 走看看