问题

在通过ajax提交表单时,表单中有Excel文件,在后台还需要读取excel文件中的数据,普通的提交方式无法实现。可以通过创建FormData对象的方式。

代码示例:

  1. 前端:
  2. 创建想要提交的formFormData对象。
  3. var form = new FormData($("#assessBreak")[0]);
  4. 提交
  5. function importExcel(form) {
  6. $.ajax({
  7. url:"${pageContext.request.contextPath}/break/importBreak",
  8. type:"post",
  9. data:form,
  10. datatype:'json',
  11. processData:false,
  12. contentType:false,
  13. success:function(data){
  14. BootstrapDialog.show({
  15. title: '注意',
  16. message: data,
  17. buttons: [{
  18. id: 'btn-ok',
  19. icon: 'glyphicon glyphicon-check',
  20. label: 'OK',
  21. cssClass: 'btn-primary',
  22. data: {
  23. js: 'btn-confirm',
  24. 'user-id': '3'
  25. },
  26. autospin: false,
  27. action: function(dialogRef){
  28. dialogRef.close();
  29. }
  30. }]
  31. });
  32. },
  33. error:function(e){
  34. BootstrapDialog.show({
  35. title: '注意',
  36. message: '请校对Excle格式',
  37. buttons: [{
  38. id: 'btn-ok',
  39. icon: 'glyphicon glyphicon-check',
  40. label: 'OK',
  41. cssClass: 'btn-primary',
  42. data: {
  43. js: 'btn-confirm',
  44. 'user-id': '3'
  45. },
  46. autospin: false,
  47. action: function(dialogRef){
  48. dialogRef.close();
  49. }
  50. }]
  51. });
  52. }
  53. });
  54. }

直接作为参数提交就行,后端正常接收。

下面是参考的链接。

前言

使用ajax请求数据,很多人都会,比如说:

  1. $.post(path,{data:data},function(data){
  2. ...
  3. },"json");

又或者是这样的ajax

  1. $.ajax({
  2. url:"${pageContext.request.contextPath}/public/testupload",
  3. type:"post",
  4. data:{username:username},
  5. success:function(data){
  6. window.clearInterval(timer);
  7. console.log("over..");
  8. },
  9. error:function(e){
  10. alert("错误!!");
  11. window.clearInterval(timer);
  12. }
  13. });

同样的,很多人也会。但是写的越多就越会发现,这样子虽然可以避免刷新页面,但是我们要写大量的js来到得数据:

  1. var username = $("#username").val();
  2. var password = $("#password").val();
  3. ...

如果数量少的话,那还没有什么,但是如果数据十分大的话,那就十分的麻烦,那有没有什么简单的方法呢?答案肯定有的!下面介绍两种方法,可以极大的提高开发人员的效率。

方法

方法一:使用FormData对象

FormData对象是html5的一个对象,目前的一些主流的浏览器都已经兼容。额,如果你说ie8什么的,那我们还是来谈谈今天的天气吧,我没听见。呵呵,开个玩笑,不支持FormData的,可以使用方法二,下面会介绍。接着说FormData,它是一个html5的javascript对象,非常的强大。

FormData可以凭空创建一个对象,然后往这个对象里面添加数据,然后直接提交,不需要写一行html代码,如下:

  1. var form = new FormData();
  2. form.append("username","zxj");
  3. form.append("password",123456);
  4. var req = new XMLHttpRequest();
  5. req.open("post", "${pageContext.request.contextPath}/public/testupload", false);
  6. req.send(form);

这样就可以向浏览器发送表单数据了,或者也可以使用Jquery这样发送:

  1. var form = new FormData();
  2. form.append("username","zxj");
  3. form.append("password",123456);
  4.  $.ajax({
  5. url:"${pageContext.request.contextPath}/public/testupload",
  6. type:"post",
  7. data:form,
  8. processData:false,
  9. contentType:false,
  10. success:function(data){
  11. window.clearInterval(timer);
  12. console.log("over..");
  13. }
  14. });

这样也可以直接发送数据到后台。

你以为这就完了?不!这才刚开始呢!!

其次FormData还支持直接从html中的表单生成数据,就是在html页面中已经有数据了,然后FormData可以直接把这个表单的数据写入这个对象,然后直接提交给后台

代码如下,先给出html代码:

  1. <form id="tf">
  2. <input type="file" name="img"/>
  3. <input type="text" name="username"/>
  4. <input type="button" value="提" onclick="test();"/>
  5. .............
  6. </form>

大家注意到没有,里面可是有文件的哦!

没错,FormData还支持困扰众多开发者已久的ajax的上传文件,以前我们上传文件,需要写一个表单直接刷新提交,但是这里不需要,下面给出提交代码:

  1. function test(){
  2. var form = new FormData(document.getElementById("tf"));
  3. // var req = new XMLHttpRequest();
  4. // req.open("post", "${pageContext.request.contextPath}/public/testupload", false);
  5. // req.send(form);
  6. $.ajax({
  7. url:"${pageContext.request.contextPath}/public/testupload",
  8. type:"post",
  9. data:form,
  10. processData:false,
  11. contentType:false,
  12. success:function(data){
  13. window.clearInterval(timer);
  14. console.log("over..");
  15. },
  16. error:function(e){
  17. alert("错误!!");
  18. window.clearInterval(timer);
  19. }
  20. });
  21. get();//此处为上传文件的进度条
  22. }

就是这么简单,使用FormData,在构造这个对象的时候,把表单的对象,作为一个参数放进去,就可以了,然后FormData,就会得到这个表单对象里面的所有的参数,甚至我们在表单中,都不需要声明enctype ="multipart/form-data" ,就可以直接提交。

使用FormData,第一是在提交表单的时候,不需要写大量的js来获得表单数据,直接把表单对象构造就行了。第二就是可以直接异步上传文件,简单牛逼爆了!

注意:使用FormData提交的时候,大家会注意到表单提交的是request payload,具体有兴趣的同学可以自己百度,它不是之前的Form data提交的,所以后台也是要经过处理的,比如springMVC就需要配置

  1. <!-- 配置nultipartresolver,注意:id名必须这样写,不然会报错 -->
  2. <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
  3. <property name="defaultEncoding" value="UTF-8"></property>
  4. <property name="maxInMemorySize" value="10240000"></property>
  5. </bean>

不然会接收不到数据,当然,后台的话,我们这里就先不管。

方法二:使用jquery.form.js

Jquery.form.js是一个强大的表单插件,其大量的提供了表单操作的各种简便的方法,下面给出一些Jquery.form.js的说明:

ajaxForm 增加所有需要的事件监听器,为ajax提交表单做准备。ajaxForm并不能提交表单。在document的ready函数中,使用ajaxForm来为ajax提交表单进行准备。 接受0个或1个参数。参数可以是一个回调函数,也可以是一个Options对象。 $("#formid").ajaxForm();
ajaxSubmit 使用ajax提交表单。 接受0个或1个参数。参数可以是一个回调函数,也可以是一个Options对象。

$("#formid").ajaxSubmit();

$("#formid").submit(function(){

$(this).ajaxSubmit();

return false;

});

formSerialize 将表单串行化(或序列化)为一个查询字符串。这个方法将返回以下格式的字符串:name1=value1&name2=value2。 $("#formid").formSerialize();
fieldSerialize 将表单的字段元素串行化(或序列化)为一个查询字符串。当只有部分表单字段需要进行串行化(或序列化)时,使用这个就很方便了。返回以下格式的字符串:name=value1&name2=value2。 $("#formid .specialFields").fieldSerialize();
fieldValue 返回匹配插入数组中的表单元素值。该方法以数组的形式返回数据。如果元素值被判定可能无效,则数组为空。 $("#formid :password").fieldValue();
resetForm 将表单恢复到初始状态。 $("#formid").resetForm();
clearForm 清除表单元素。该方法将所有的text、password、textarea置空,清除select元素中的选定,以及所有radio按钮和checkbox按钮重置为非选定状态。 $("#formid").clearForm();
clearFields 清除字段元素。只有部分表单元素需要清除时方便使用。 $("#formid .specialFields").clearFields();

Options对象

ajaxForm和ajaxSubmit都支持众多的选项参数,这些选项参数可以使用一个Options对象来提供。

target 指明页面中由服务器响应进行更新的元素。元素的值可能被指定为一个jQuery选择器字符串、一个jquery对象、一个DOM元素。 默认值:null
url 指定提交表单数据的URL。 默认值:表单的action属性值
type 指定提交表单数据的方法(method):“GET”或“POST”。 默认值:GET
beforeSubmit 表单提交前被调用的回调函数。如果回调函数返回false表单将不被提交。回调函数带三个调用参数:数组形式的表单数据,jQuery表单对象,以及传入ajaxForm/ajaxSubmit中的Options对象。 默认值:null
success 表单成功提交后调用的回调函数。然后dataType选项值决定传回responseText还是responseXML的值。 默认值:null
dataType 返回的数据类型:null、"xml"、"script"、"json"其中之一。 默认值:null
resetForm 表示如果表单提交成功是否进行重置。 默认值:null
clearForm 表示如果表单提交成功是否清除表单数据。 默认值:null

那么现在来说一些它的主要用法吧!

它也支持对一个表单的ajax提交,而且提交方式更为简便,如下:

html:

  1. <form id="tf">
  2. <input type="file" name="img"/>
  3. <input type="text" name="username"/>
  4. <input type="button" value="提" onclick="test();"/>
  5. </form>

下面使用jquery.form.js的表单插件来提交表单

  1. $("#tf").ajaxSubmit();

额,就是这么简单,你也不要问我为什么就是这么简单,然后它就是会把整个表单,作为一个ajax来提交,同样的,它也支持文件上传!一些其它的用法,请参照前面给出的说明就可以了!

原文链接:https://www.cnblogs.com/zhuxiaojie/p/4783939.html

FormData提交文件(十四)的更多相关文章

  1. JavaWeb 后端 <十四> 文件上传下载

    1.文件上传与下载 案例: 注册表单/保存商品等相关模块! --à 注册选择头像 / 商品图片 (数据库:存储图片路径 / 图片保存到服务器中指定的目录) 1.1 文件上传 文件上传,要点: 前台: ...

  2. 第三百八十四节,Django+Xadmin打造上线标准的在线教育平台—路由映射与静态文件配置以及会员注册

    第三百八十四节,Django+Xadmin打造上线标准的在线教育平台—路由映射与静态文件配置以及会员注册 基于类的路由映射 from django.conf.urls import url, incl ...

  3. ajax利用FormData异步文件提交

    通常情况下,我们上传文件都会使用form表单来提交文件.但有时候,我们会有异步提交文件的需求,在这种情况下,我们就需要新建一个Formdata来提交文件,后台如果使用的是PHP的话可以使用$_FILE ...

  4. JAVA之旅(二十四)——I/O流,字符流,FileWriter,IOException,文件续写,FileReader,小练习

    JAVA之旅(二十四)--I/O流,字符流,FileWriter,IOException,文件续写,FileReader,小练习 JAVA之旅林林总总也是写了二十多篇了,我们今天终于是接触到了I/O了 ...

  5. Spring MVC 使用介绍(十四)文件上传下载

    一.概述 文件上传时,http请求头Content-Type须为multipart/form-data,有两种实现方式: 1.基于FormData对象,该方式简单灵活 2.基于<form> ...

  6. 第三百七十四节,Django+Xadmin打造上线标准的在线教育平台—创建课程app,在models.py文件生成4张表,课程表、课程章节表、课程视频表、课程资源表

    第三百七十四节,Django+Xadmin打造上线标准的在线教育平台—创建课程app,在models.py文件生成4张表,课程表.课程章节表.课程视频表.课程资源表 创建名称为app_courses的 ...

  7. 第三百四十四节,Python分布式爬虫打造搜索引擎Scrapy精讲—craw母版l创建自动爬虫文件—以及 scrapy item loader机制

    第三百四十四节,Python分布式爬虫打造搜索引擎Scrapy精讲—craw母版l创建自动爬虫文件—以及 scrapy item loader机制 用命令创建自动爬虫文件 创建爬虫文件是根据scrap ...

  8. 孤荷凌寒自学python第三十四天python的文件操作对file类的对象学习

     孤荷凌寒自学python第三十四天python的文件操作对file类的对象学习 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 一.close() 当一个file对象执行此方法时,将关闭当前 ...

  9. vue+axios通过formdata提交参数和上传文件

    demo.vue 文件 <template> <div class="demo"> <input v-model="importForm.m ...

随机推荐

  1. git介绍及使用

    一.架构 版本库(仓库):工作区中有一个隐藏目录.git,这个目录不属于工作区,而是git的版本库,是git管理的所有内容. 暂存区:版本库中包含一个临时区域,保存下一步要提交的文件. 分支:版本库中 ...

  2. springboot实现自定义拦截器

    为了更容易理解,我们通过一个代码例子来演示. 例子: 我们现在要访问http://localhost:8080/main.html页面,这个页面需要登录之后才能够浏览,没登录不能浏览. 那么现在问题来 ...

  3. 日常Bug排查-Nginx重复请求?

    日常Bug排查-Nginx重复请求? 前言 日常Bug排查系列都是一些简单Bug排查,笔者将在这里介绍一些排查Bug的简单技巧,其中不乏一些看起来很低级但很容易犯的问题. 问题现场 有一天运维突然找到 ...

  4. 性能报告之HTML5 性能测试报告

    1. 引言 1.1. 编写目的 HTML5 作为当前"最火"的跨平台.跨终端(硬件)开发语言,越来越受到前端开发者 的重视,无论是 PC 端还是当前"火热"的移 ...

  5. UF_VEC 向量相关

    Open C UF_VEC2_addUF_VEC2_affine_combUF_VEC2_ask_perpendicularUF_VEC2_componentsUF_VEC2_convex_combU ...

  6. apache jmeter下载与安装

    JMeter是Apache软件基金会的产品,用于对静态的和动态的资源性能进行测试.jmeter可以运行在多个平台上,如Windows和Linux,本文讲的是在Windows安装jmeter. 工具/原 ...

  7. 你知道这高效的12个Java精品库嘛?

    01. JUnit 第一个要说的当然是JUnit了,JUnit毕竟是Java圈目前最知名及常用的测试框架.JUnit之所以能够成为Java圈中最热门的测试库,是因为对于很多项目而言,单元测试是非常重要 ...

  8. 文字识别OCR开源框架的对比--Tesseract vs EasyOCR

    ​ 前言: OCR文字识别在目前有着比较好的应用,也出现了很多的文字识别软件,但软件是面向用户的.对于我们技术人员来说,有时难免需要在计算机视觉任务中加入文字识别,如车牌号识别,票据识别等,因此软件对 ...

  9. Ubuntu18.04下安装Docker并配置SSL证书加密远程连接

    Docker下载与安装 下载安装包 国内网络连接docker镜像还是比较慢的,这里推荐直接下载docker镜像,Ubuntu镜像下载路径为:https://download.docker.com/li ...

  10. Destroying The Graph 最小点权集--最小割--最大流

    Destroying The Graph 构图思路: 1.将所有顶点v拆成两个点, v1,v2 2.源点S与v1连边,容量为 W- 3.v2与汇点连边,容量为 W+ 4.对图中原边( a, b ), ...