位置: 编程技术 - 正文

谈谈基于iframe、FormData、FileReader三种无刷新上传文件的方法(iframe例子)

编辑:rootadmin

推荐整理分享谈谈基于iframe、FormData、FileReader三种无刷新上传文件的方法(iframe例子),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:谈谈基于产品的供应链设计,谈谈基于数学核心素养发展的小学数学作业设计策略,谈谈基于网络的合作化教学策略包括哪些内容,谈谈基于波特竞争五因素理论的海尔的竞争战略,谈谈基于信息系统的组织战略如何制定,谈谈基于波特竞争五因素理论的海尔的竞争战略,谈谈基于波特竞争五因素理论的海尔的竞争战略,谈谈基于波特竞争五因素理论的海尔的竞争战略,内容如对您有帮助,希望把文章链接给更多的朋友!

发请求有两种方式,一种是用ajax,另一种是用form提交,默认的form提交如果不做处理的话,会使页面重定向。以一个简单的demo做说明:

html如下所示,请求的路径action为"upload",其它的不做任何处理:

服务端(node)response直接返回: "Recieved form data",演示如下:

可以看到默认情况下,form请求upload的同时重定向到upload。但是很多情况下是希望form请求像ajax一样,不会重定向或者刷新页面。像上面的场景,当上传完成之后,将用户选择的头像显示在当前页面。

解决办法第一种是使用html5的FormData,将form里面的数据封装到FormData对象里,然后再以POST的方式send出去。如下面代码所示,对提交按钮的单击事件做一个响应,代码第6行获取到form的DOM对象,然后第8行构造一个FormData的实例,第行,将form数据发送出去。

上传成功后,服务将返回图片的访问地址,补充行对请求成功的处理:在submit按钮的上方位置显示上传的图片:

示例:

如果使用jQuery,可以把formData作为ajax的data参数,同时设置contentType: false和processData: false,告诉jQuery不要去处理请求头和发送的数据。

看起来这种提交方式跟ajax一样,但是其实并不是完全一样,form提交的数据格式有三种,如果要上传文件则必须为multipart/form-data,所以上面的form提交请求里的http的头信息里面的Content-Type为multipart/form-data,而普通的ajax提交为application/json。form提交完整的Content-Type如下:

"content-type":"multipart/form-data; boundary=------WebKitFormBoundaryYOE7pWLqdFYSeBFj"

除了multipart/form-data之外,还指定了boundary,这个boundary的作用是用来区分不同的字段。由于FormData对象是不透明的,调用JSON.stringify将会返回一个空的对象{},同时FormData只提供append方法,所以无法得到FormData实际上传的内容,但是可以通过分析工具或者服务收到的数据进行查看。在上面如果上传一个文本文件,那么服务收到的POST数据的原始格式是这样的:

------WebKitFormBoundaryYOE7pWLqdFYSeBFj

Content-Disposition: form-data; name="user"

abc

------WebKitFormBoundaryYOE7pWLqdFYSeBFj

Content-Disposition: form-data; name="file"; filename="test.txt"Content-Type: text/plain

这是一个文本文件的内容。

------WebKitFormBoundaryYOE7pWLqdFYSeBFj--

从上面服务收到的数据看出FormData提交的格式,每个字段以boundary隔开,最后以--结束。而ajax请求,send出去的数据格式是自定义的,一般都是以key=value中间用&连接:

谈谈基于iframe、FormData、FileReader三种无刷新上传文件的方法(iframe例子)

服务就会收到和send发出去的字符串一模一样的内容,然后再作参数解析,所以就得统一参数的格式:

user=abc&file=这是一个文本文件的内容

从这里可以看出POST本质上并不比GET安全,POST只是没有将数据放在网址传送而已。

考虑到FormData到了IE才支持,如果要支持较低版本的IE,那么可以借助iframe。

文中一开始就说,默认的form提交会使页面重定向,而重定向的规则在target中指定,可以和a标签一样指定为"_blank",在新窗口中打开;还可以指定为一个iframe,在该iframe中打开。所以可以弄一个隐藏的iframe,将form的target指向这个iframe,当form请求完成时,返回的数据就会由这个iframe显示,正如上面在新页面显示的:"Recieved form data"。请求完成后,iframe加载完成,触发load事件,在load事件的处理函数里,获取该iframe的内容,从而拿到服务返回的数据了!拿到后再把iframe删掉。

在提交按钮的响应函数里,首先创建一个iframe,设置iframe为不可见,然后再添加到文档里:

改变form的target为iframe的name值:

然后再响应iframe的load事件:

第二种办法到这里就基本可以了,但是如果看邮箱或者QQ邮箱上传文件的方式,会发现和上面的两种方法都不太一样。用httpfox抓取请求的数据,会发现上传的内容的格式并不是上面说的用boundary隔开,而是直接把文件的内容POST出去了,而文件名、文件大小等相关信息放在了文件的头部。如邮箱:

POST Data:

this is a text

Headers:

Mail-Upload-name: content.txt Mail-Upload-size:

可以推测它们应该是直接读取了input文件的内容,然后直接POST出去了。要实现这样的功能,可以借助FileReader,读取input文件的内容,再保留二进制的格式发送出去:

代码第行执行读文件,读取完毕后触发第6行的load响应函数,第7行以二进制文本形式发送出去。由于sendAsBinary的支持性不是很好,可以自行实现一个:

代码的关键在于第6行,将字符串转成8位无符号整型,还原二进制文件的内容。在执行了fr.readAsBinaryString之后,二进制文件的内容将会以utf-8的编码以字符串形式存放到result,上面的第6行代码将每个unicode编码转成整型(&0xff或者parseInt),存放到一个8位无符号整型数组里面,第8行把这个数组发送出去。如果直接send,而不是sendAsBinary,服务收到的数据将无法正常还原成原本的文件。

上面的实现需要考虑文件太大,需分段上传的问题。

关于FileReader的支持性,IE以上支持,IE9有另外一套File API。

文章讨论了3种办法实现无刷新上传文件,分别是使用iframe、FormData和FileReader,支持性最好是的iframe,但是从体验的效果来看FormData和FileReader更好,因为这两者不用生成一个无用的DOM再删除,其中FormData最简单,而FileReader更加灵活。

下面给大家介绍iframe无刷新上传文件

<!--和一般的<form>标签相比多了一个target属性罢了,用于指定标签页在哪里打开以及提交数据。

如果没有设置该属性,就会像平常一样在本页重定向打开action中的url。

而如果设置为iframe的name值,即"upload"的话,就会在该iframe内打开,因为CSS设置为隐藏,因而不会有任何动静。若将display:none去掉,还会看到服务器的返回信息。

全面解析Bootstrap图片轮播效果 一.结构分析一个轮播图片主要包括三个部分:轮播的图片轮播图片的计数器轮播图片的控制器第一步:设计轮播图片的容器。在Bootstrap框架中采用carouse

学习JavaScript设计模式(代理模式) 代理模式是为一个对象提供一个代用品或占位符,以便控制对它的访问代理模式的用处(个人理解):为了保障当前对象的单一职责(相对独立性),而需要创

基于javascript代码检测访问网页的浏览器呈现引擎、平台、Windows操作系统、移动设备和游戏系统 废话不多说了,直接给大家贴js代码了,代码附有注释,感兴趣的朋友一起学习吧。/***Author:laixiangran.*Createdbylaixiangranon//.*检测访问网页的浏览器

标签: iframe例子

本文链接地址:https://www.jiuchutong.com/biancheng/387084.html 转载请保留说明!

上一篇:解决JavaScript数字精度丢失问题的方法(javascript+)

下一篇:全面解析Bootstrap图片轮播效果(全面解析少女时代关系)

  • 个人所得税起征点2023税率表
  • 基本户可以直接转账给个人吗
  • 一般纳税人公司转让一般卖多少钱
  • 购买私募基金有风险吗
  • 企业所得税退抵税费申请(汇算清缴)怎么撤销
  • 退回的附加税能退回来吗
  • 有形资产负债率和有形净值负债率
  • 企业的培训费会计分录
  • 没有车加油费可以入账吗
  • 房地产企业拆迁安置土地增值税清算疑点
  • 缴纳地方教育附加费现金流量选什么
  • 逾期不缴纳税款责令限改期限内改正的
  • 融资租赁是怎么操作的
  • 转让折旧怎么算
  • 承包费收入如何交增值税
  • 简易计税是否可以开增值税专用发票
  • 对方已经认证的发票怎么作废
  • 代开专票地税没交怎么办?
  • 企业所得税季报填报说明
  • 国家税务总局关于取消增值税扣税凭证
  • 金融企业贷款利息收入确认
  • 进项税大于销项税是不是不用交税了
  • 筹建期间开办费账务处理
  • 户外广告经营总额
  • 投资活动净现金流为负说明什么
  • win10下载软件被阻止安装怎么办
  • 进项税和销项税怎么抵扣
  • tkinter美观界面
  • typecho安装插件
  • 库存现金的含义及特点
  • php缩放图片
  • 土地增值税内控报告
  • 划拨用地无使用权怎么办
  • 用盈余公积弥补以前年度亏损
  • php写的代码怎么运行
  • 承兑汇票到期超过10天怎么办
  • 商贸公司销售
  • php 带cookie post
  • 卡拉公路
  • vue面试题2020
  • 本地住宿费能报销吗
  • 运输发票开具条件
  • 有什么是即征即退税的
  • 客户的赔偿金会计分录
  • python爬虫详细教程
  • 联营企业有重大影响吗
  • MicrosoftSQLserver2014可以卸载吗
  • 高新技术企业三季度申报所得税研发费加计怎么扣除
  • sqlgun
  • 生育津贴到公司账户了多久给个人
  • 哪些进项税额不能抵扣
  • 汇算清缴时资产折旧怎么填
  • 弥补以前年度亏损后缴纳所得税
  • 企业合并中或有对价的会计处理
  • 出售资产时递延所得税转回是全部收入吗
  • 应收账款已收回95元
  • 公司名义送花篮属于什么费用
  • 企业会计做账教程
  • 新建公司需要什么
  • windows2000自动登陆
  • ubuntu20.04命令
  • 2016年最火的歌曲排行前100首
  • xp系统问题
  • spoolsrv32.exe - spoolsrv32进程是什么文件 有何作用
  • 2021年win10累积更新
  • sgbhp.exe - sgbhp是什么进程 有什么用
  • win10激活突然失效
  • win7 安装系统
  • win7系统无法删除打印机驱动
  • 创建nodejs项目的步骤
  • unity打包package
  • eclipse安转
  • logcat read failure
  • 解决口苦的最佳方法
  • 残疾人交房产税有什么优惠
  • 国家税务总局2016年17号公告
  • 营业收入是含增值税的收入吗
  • 考公务员国家税务局好吗
  • 合肥高新公共事务管理有限公司
  • 杜蕾斯验证真伪扫描
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设