atitit.ajax上传文件的实现原理 与设计
atitit.ajax上传文件的实现原理 与设计
2. 传统的html4 + ajax 是无法直接实现上传文件 1
5. 能够採用HTML5。用jQuery,Ajax实现文件上传,不仅如此。你能够做文件验证(名称,大小,MIME类型)或利用HTML5的进度标签(或者div)处理进度事件。
5
1. 上传文件的三大难题
1.1. 本地预览
1.2. 无刷新
1.3. 进度显示
2. 传统的html4 + ajax 是无法直接实现上传文件
.ajax与后台通信都是通过传递字符串
由于从浏览器安全角度考虑,新浏览器基本上都禁止了通过JS在client直接读写/显示client的文件.
并且有些浏览器仅仅能得到文件名称,而不同意得到 完整的文件路径.
作者:: 老哇的爪子 Attilax 艾龙。 EMAIL:1466519819@qq.com
转载请注明来源: http://blog.csdn.net/attilax
本来Ajax是不支持上传文件的,可是能够通过IFrame技术模拟实现,异步提交。原理实际上就是利用了一个隐藏的Iframe子窗口,把提交的表单的target指向这个隐藏的窗口。在提交时,浏览器的头部还会出现载入信息,可是页面却没有不论什么刷新,勉强实现了Ajax的异步上传。
插件的原理就是构建一个form,然后用POST的方式提交整个Form。在后台中。通过传递来的Form。得到HttpPostedFile。在获取当中的图片信息,这样就实现后台上传图片了。
2.1. 传统的实现方式iframe
而本文实现的文件上传也是无页面刷新的,能够说是一种"类似AJAX"方法。
開始之前先说两句无关的,事实上在ajax出现之前。web应用也能够是无刷新的,那时大多通过IFrame来做到这一点。当然Ajax出现之后,人们一窝蜂地投奔Ajax 的阵营了。iFrame 就乏人问津了。
可是用iFrame来实现无刷新上传文件确实一个非常好的选择。ps:Ajax技术基本上能够说是由google公司带起来的。但少Gmail中上传文件用的还是 IFrame,所以说使用IFrame来上传文件是最好的选择。
我在这里这里用的技术是jsp,事实上asp,php等也是一
2.2. html5转码base64
来上传
.
2.3. 其它插件FLASH的实现原理
如今所谓比較成熟的 ajax上传,功能核心都不是ajax
1.通过一个iframe,由ajax(不如说是js)来控制.核心是iframe中的Form
2.通过专门的组件,譬如uploadify,其核心事实上是flash.仅仅只是做成了Jquery插件.事实上有专门的FLASH上传组件,如swfupload,其js代码都是自带的.
1.iframe原理简单,兼容性强,自己写JS+iframe也能轻易实现无刷新上传
2.基于flash的,如今是风潮,并且有实时进度条显示.但client浏览器必须安装flash插件(虽说大多数浏览器都已安装了),并且flash版本号升级时,有可能导致上传功能失败.记得flash由9.x升级到10.x时就出现了这样的问题. 另外,在firefox下,基于flash的上传,假设在后台须要读取用户的session/cookie时,基本上会出错,这是flash与firefox之间的一个眼下都未解决的bug.
3. 上传进度的实现原理
长期以来,开发人员们一直为此苦恼,大部分为解决问题都採用了flash作为解决方式。但flash并不是灵丹妙药。由于flash版本号,割据造成的问题有时反倒成为了噩梦。有些站点则採用了form标签的enctype=multipart/form-data属性。但这一属性要求server作出特殊的设置才可以显示运行进度。并且本身也比較复杂,复杂就意味着easy出现错误,这可不是我们想要的。
3.1. 使用ajax结合服务端的进度返回,比較麻烦
js不能直接计算进度。。
4. 本地预览的解决
html4,有些server能够通过js获取到文件全路径。能够实现本地预览。否则。要通过plulgin方式。。
,我们将使用 HTML5 的 FileReader 实如今浏览器上的文件预览
4.1. 用HTML5上传文件
在HTML5标准中,XMLHttpRequest对象被又一次定义,被称为“XMLHttpRequest Level 2”,当中包括了下面5个新特性:
§ 支持上传、下载字节流,比方文件、blob以及表单数据
§ 添加了上传、下载中的进度事件
§ 跨域请求的支持
§ 同意发送匿名请求(即不发送HTTP的Referer部分)
§ 同意设置请求的超时
在这篇教程中,我们主要关注第一和第二项特性,尤其是第二项——它可以提供我们想要的上传进度。和之前的方案不同。这个方法并不要求server作出特殊的设置,因此大家边看教程就行边动手试试了。
上面图示的就是我们可以实现的内容:
§ 显示上传的文件信息,比方文件名称、类型、尺寸
§ 一个可以显示真实进度的进度条
§ 上传的速度
§ 剩余时间的估算
§ 已上传的数据量
§ 上传结束后server返回的响应
5. 能够採用HTML5,用jQuery,Ajax实现文件上传。不仅如此,你能够做文件验证(名称,大小。MIME类型)或利用HTML5的进度标签(或者div)处理进度事件。
HTML5攻克了以往网页编写的一个难题:带有上传进度的文件上传。
近期我也在做文件上传,我不想用flash、iframe或其他插件,经过一番研究,我想出了解决方式。
HTML:
<form enctype="multipart/form-data"> <input name="file" type="file" /> <input type="button" value="Upload" /> </form> <progress></progress> |
首先,你能够做一些验证。比如文件的onChange事件:
$(':file').change(function(){ var file = this.files[0]; name = file.name; size = file.size; type = file.type; //your validation }); |
button点击触发Ajax:
$(':button').click(function(){ var formData = new FormData($('form')[0]); $.ajax({ url: 'upload.php', //server script to process data type: 'POST', xhr: function() { // custom xhr myXhr = $.ajaxSettings.xhr(); if(myXhr.upload){ // check if upload property exists myXhr.upload.addEventListener('progress',progressHandlingFunction, false); // for handling the progress of the upload } return myXhr; }, //Ajax事件 beforeSend: beforeSendHandler, success: completeHandler, error: errorHandler, // Form数据 data: formData, //Options to tell JQuery not to process data or worry about content-type cache: false, contentType: false, processData: false }); }); |
处理进度:
function progressHandlingFunction(e){ if(e.lengthComputable){ $('progress').attr({value:e.loaded,max:e.total}); } } |
HTML5的文件上传很easy,但必须在支持HTML5的浏览器中执行。
5.1. 上传框架插件
jquery.form.js" 。
6. 參考
Ajax + JSP实现异步文件上传 - Sean's Blog的日志 - 网易博客.htm
jQuery异步上传文件 - jQuery学习 - 程序猿博客.htm
Jquery ajaxsubmit上传图片实现代码_jquery_脚本之家.htm
(iframe方式)ajax无刷新上传图片 - zhangchun - 博客园.htm
HTML5应用之文件上传 - 小米哥的专栏 - 博客频道 - CSDN.NET.htm
HTML5应用之文件上传 - 小米哥的专栏 - 博客频道 - CSDN.NET.htm
atitit.ajax上传文件的实现原理 与设计的更多相关文章
- ajax上传文件显示进度
下面要做一个ajax上传文件显示进度的操作,文末有演示地址 这里先上代码: 1.前端代码 upload.html <!DOCTYPE html> <html lang="e ...
- Ajax上传文件/照片时报错TypeError :Illegal invocation
问题 Ajax上传文件/照片时报错TypeError :Illegal invocation 解决 网上搜索问题,错误原因可能有以下几个,依次检查: 请求类型有误,如post请求,但在后台设置的是ge ...
- IE8/9 JQuery.Ajax 上传文件无效
IE8/9 JQuery.Ajax 上传文件有两个限制: 使用 JQuery.Ajax 无法上传文件(因为无法使用 FormData,FormData 是 HTML5 的一个特性,IE8/9 不支持) ...
- springMVC+jsp+ajax上传文件
工作中遇到的小问题,做个笔记 实现springMVC + jsp + ajax 上传文件 HTML <body> <form id="myform" method ...
- Ajax上传文件进度条显示
要实现进度条的显示,就要知道两个参数,上传的大小和总文件的大小 html5提供了一个上传过程事件,在上传过程中不断触发,然后用已上传的大 小/总大小,计算上传的百分比,然后用这个百分比控制div框的显 ...
- 伪ajax上传文件
伪ajax上传文件 最近在折腾伪ajax异步上传文件. 网上搜索了一下,发现大部分方法的input file控件都局限于form中,如果是在form外的呢? 必须动态生成一个临时form和临时if ...
- flask jQuery ajax 上传文件
1.html 代码 <div> <form id="uploadForm" enctype="multipart/form-data" > ...
- 闲话ajax,例ajax轮询,ajax上传文件[开发篇]
引语:ajax这门技术早已见怪不怪了,我本人也只是就自己真实的经验去总结一些不足道的话.供不是特别了解的朋友参考参考! 本来早就想写一篇关于ajax的文章的,但是前段时间一直很忙,就搁置了,趁着元旦放 ...
- ajax上传文件及进度显示
之前在博文:原生ajax写法就提及过ajax2.0与1.0的差别是多了FormData和利用FormData文件上传(当然还有跨域,但不是本文的重点). 那么具体怎么样实现ajax上传文件呢? 一般来 ...
随机推荐
- Asp.net 之页面处理积累(一)
1.实现超链接跳转网页直接定位到跳转后页面中部,而不是要往下拖,才能看到想看的内容 (1)在跳转后页面想定位的位置加:<a name="middle" id="mi ...
- UVALive 2949 Elevator Stopping Plan(二分 + 贪心)
ZSoft Corp. is a software company in GaoKe Hall. And the workers in the hall are very hard-working. ...
- Web 前端攻防(2014版)-baidu ux前端研发部
http://fex.baidu.com/articles/page2/ Web 前端攻防(2014版) zjcqoo | 20 Jun 2014 禁止一切外链资源 外链会产生站外请求,因此可以被利用 ...
- UITextField限制输入中文字数
前面写一了篇,UITextField Category来限制输入的字数,是有个Bug的,要输入中文时会crash.如今改动 了下.代码例如以下 .h文件 #import <UIKit/UIKit ...
- vue单文件(sfc)编译为js的流程
1.流程 2.参考文章地址 https://segmentfault.com/a/1190000012336392 3.Vue框架的parseComponent https://github.com/ ...
- js 数组清空 方法 汇总
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...
- 安装itunes时提示不能删除旧版本的apple应用程序支持
下载我 选择需要卸载清理的程序(所有与Apple有关的) ok
- 从官方的BZR源安装avant-window-navigator
资料来自: http://blog.163.com/azhai@126/blog/static/111056312008315842433/http://www.ibentu.org/2007/09/ ...
- TCP Socket 粘包
这两天看csdn有一些关于socket粘包,socket缓冲区设置的问题.发现自己不是非常清楚,所以查资料了解记录一下: 一两个简单概念长连接与短连接: 1.长连接 Client方与Server ...
- PHP反射获取当前函数的内容
<?php $test = function () { echo 'hello world'; }; function closure_dump($closure) { try { $func ...