首页 > 其他分享 >使用ajaxFileUpload实现文件异步上传

使用ajaxFileUpload实现文件异步上传

时间:2022-12-07 17:03:56浏览次数:38  
标签:异步 ajaxFileUpload js myfile data 表单 上传 response


 最近在项目中遇到要使用ajax提交包含file输入框的表单的情况,网上查了下,发现ajaxFileUpload.js插件的比较多。就研究了下,发现真的不错。

传统的包含file输入框的表单提交遇到的问题:

       1.表单要添加“enctype=multipart/form-data”,这样后台就无法像普通表单提交那样通过request.getParameter(name)来获得用户提交的参数。

        2.表单一定要使用submit提交,不能使用ajax将表单信息序列化异步提交。这样就导致了不能实现提交结果的异步刷新和响应。

//传统表单的ajax序列化异步提交      

artDialog.confirm('确认要保存用户信息?',function(){

$.ajax({
        type: "POST",
        url:$("#form").attr("action"),
        data:$('#form').serialize(),// 要提交的表单 
        dataType:'json',
        success: function(data) {
        if(data){
        artDialog.alert(data.message);
                   if(data.succeed == true){
                    gotoView('<%=path%>/userManage/getlist.do');
                  }  
        }   
        }
    });
});


ajaxFileUpload的使用:

1.js的引入

       <script src="<%=path%>/resource/js/jquery.js"></script>

      <script type="text/javascript" src="<%=path%>/js/ajaxfileupload.js"></script>


2.file文本框,不受enctype=multipart/form-data的限制,可单独提交

                <img src="<%=path%>/resource/images/sex1.png" id="personImage" style="width:160px;height:204px;">

               <input id="fileToUpload" type="file" name="fileToUpload" class="input">  
               <a href="Javascript:void(0);" οnclick="ajaxFileUpload();">上传头像</a>


3.js上传代码——核心

         $.ajaxFileUpload({  
               url : '<%=path%>/userManage/fileToUpload.do',
               secureuri : false,  
               fileElementId : 'fileToUpload',// 上传控件的id  
               dataType : 'json',  
              success : function(data, status) {
   if(data.message) {
        alert(data.message);
   }
   if(data.succeed == true){
$("#personImage").attr("src", "<%=path%>/userManage/previewImage.do?r="+Math.random());//改变图片显示
   }
    },
error : function(data, status, e) {
alert('上传出错');
}
           }); 

4.spring mvc上传文件的配置文件spring-MVC.xml

       <!-- 配置文件上传 -->
    <bean id="multipartResolver"  
        class="org.springframework.web.multipart.commons.CommonsMultipartResolver" p:defaultEncoding="utf-8">  
        <property name="maxUploadSize">  
            <value>104857600</value>  
        </property>  
        <property name="maxInMemorySize">  
            <value>4096</value>  
        </property>  
    </bean>  


5.控制层接受上传文件

//头像上传
@RequestMapping(value="/fileToUpload.do")
public void fileToUpload(@RequestParam("fileToUpload") MultipartFile myfile,HttpServletRequest request,HttpServletResponse response,HttpSession session){
try {
        /*System.out.println("文件原名: " + myfile.getOriginalFilename());
           System.out.println("文件名称: " + myfile.getName());
           System.out.println("文件长度: " + myfile.getSize());
           System.out.println("文件类型: " + myfile.getContentType());
           System.out.println("========================================");*/
           long size = myfile.getSize();//文件大小
           String orgFilename =  myfile.getOriginalFilename();
           String name =  myfile.getName();//input的name
           String contentType = myfile.getContentType();
           PrintWriter writer = response.getWriter();
 response.setCharacterEncoding("UTF-8");//这两句是必须的,一定要加

           if(size>1024*1024){
            jsonMap.put("succeed",false);
    jsonMap.put("message","图片大小不能超过1M!");
    writer.print("{succeed:false,message:\"图片大小不能超过1M!\"}");
           }else{
            session.setAttribute("myfileDate", myfile.getBytes());
writer.print("{");//username
//writer.print("succeed:true,message:\"文件大小:"+myfile.getSize()+",文件名:"+myfile.getName()+"\"");
writer.print("succeed:true,message:\"文件上传成功!\"");
writer.print("}");
           }
           writer.close();
} catch (Exception e) {
e.printStackTrace();
}
}


6.获得保存到session中的图片信息

        //获得上传到session中的图片信息
@RequestMapping(value="/previewImage.do")
public void previewImage(HttpServletRequest request,HttpServletResponse response,HttpSession session){
try {
byte[] photo=  (byte[]) session.getAttribute("myfileDate");
                        if(photo!=null){
                        OutputStream os = response.getOutputStream();
    InputStream is = new ByteArrayInputStream(photo); 
   
    byte buf[] = new byte[1024];
    while ((is.read(buf)) != -1) {
       os.write(buf);
    }
    is.close();
    os.close();
                        }
} catch (Exception e) {
e.printStackTrace();
}
}



遇到的问题:

1.上传文件失败时,不能进入 $.ajaxFileUpload中的error中,在火狐下查看,出现js报错。

ajaxFileUpload.js中加入下面的代码:

{
    if ( s.error ) {
    s.error.call( s.context || s, xhr, status, e );
    }
    if ( s.global ) {
    (s.context ? jQuery(s.context) : jQuery.event).trigger( "ajaxError", [xhr, s, e] );
    }
    }


2.ie9下明明网络请求返回的是200,但是总是提示上传文件失败;而ie8下弹窗提示出现了乱码。

        解决方法:给response设置返回字符编码格式

        response.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");






标签:异步,ajaxFileUpload,js,myfile,data,表单,上传,response
From: https://blog.51cto.com/u_15905482/5919719

相关文章

  • web技术分享| 图片上传与图片裁剪结合 vue3
    需求:上传的图片限制长宽相同;只能上传图片;图片大小限制500k当前项目仅需要上传的图片信息项目组件使用裁剪:vue-cropperimport"vue-cropper/dist/index.c......
  • spring-boot构建docker镜像上传仓库
    spring-boot构建docker镜像上传仓库创建一个简单spring-boot-web项目<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xm......
  • SiteFactory支持ppt自动上传
    ​如何做到ueditor批量上传word图片?1、前端引用代码<!DOCTYPE html PUBLIC "-//W3C//DTDXHTML1.0Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-......
  • layui文件上传需要编写动态URL的时候需要重载方法
    varuploadInst=upload.render({elem:'#WebButton'/*,url:url//此处配置你自己的上传接口即可*/,auto:true......
  • vue使用阿里云视频点播 上传后- 如何播放
    阿里云视频点播  播放器SDK-- web播放器文档地址:https://www.alibabacloud.com/help/zh/apsaravideo-for-vod/latest/apsaravideo-player-sdk-for-web-overview ......
  • vue使用阿里云视频点播上传
    Web(JavaScript)上传SDK(STS方式)阿里云文档地址:https://www.alibabacloud.com/help/zh/apsaravideo-for-vod/latest/use-the-upload-sdk-for-javascript     ......
  • vue项目中上传文件到阿里云oss方法 结合element ui 中的 el-upload
       在项目需求中,关于图片、视频、文件等上传文件,一般不是直接放置在自己的后台服务器上,一般都会购买云服务进行存储。譬如阿里云的oss对象存储。   前端开发项......
  • typora上传博客到博客园及所遇问题解决方法
    一.配置dotnet1.下载dotnet首先要到官网下载dotnet,这里根据本人多次下载尝试以及上网查询,推荐下载5.0版本的下载地址根据自己电脑配置下载,注意下载左边的,不需要下载右......
  • Python异步爬虫(aiohttp版)
    异步协程不太了解的话可以去看我上篇博客:https://www.cnblogs.com/Red-Sun/p/16934843.htmlPS:本博客是个人笔记分享,不需要扫码加群或必须关注什么的(如果外站需要加群或关......
  • SpringBoot文件分片上传,断点续传
    ​ 1 背景用户本地有一份txt或者csv文件,无论是从业务数据库导出、还是其他途径获取,当需要使用蚂蚁的大数据分析工具进行数据加工、挖掘和共创应用的时候,首先要将本地文......