atitit.ajax上传文件的实现原理 与设计

atitit.ajax上传文件的实现原理 与设计

1. 上传文件的三大难题 1

1.1. 本地预览 1

1.2. 无刷新 1

1.3. 进度显示 1

2.  传统的html4  + ajax 是无法直接实现上传文件 1

2.1. 传统的实现方式iframe 2

2.2. html5转码base64 3

2.3. 其它插件FLASH的实现原理 3

3. 上传进度的实现原理 3

3.1. 使用ajax结合服务端的进度返回,比較麻烦 4

4. 本地预览的解决 4

4.1. 用HTML5上传文件 4

5. 能够採用HTML5。用jQuery,Ajax实现文件上传,不仅如此。你能够做文件验证(名称,大小,MIME类型)或利用HTML5的进度标签(或者div)处理进度事件。
5

5.1. 上传框架插件 7

6. 參考 7

1. 上传文件的三大难题

1.1. 本地预览

1.2. 无刷新

1.3. 进度显示

2.  传统的html4  + ajax 是无法直接实现上传文件

.ajax与后台通信都是通过传递字符串

由于从浏览器安全角度考虑,新浏览器基本上都禁止了通过JS在client直接读写/显示client的文件.

并且有些浏览器仅仅能得到文件名称,而不同意得到 完整的文件路径.

作者:: 老哇的爪子 Attilax 艾龙。  EMAIL:[email protected]

转载请注明来源: 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:


1

2

3

4

5


<form enctype="multipart/form-data">

<input name="file" type="file" />

<input type="button" value="Upload" />

</form>

<progress></progress>

首先,你能够做一些验证。比如文件的onChange事件:


1

2

3

4

5

6

7


$(‘:file‘).change(function(){

var file = this.files[0];

name = file.name;

size = file.size;

type = file.type;

//your validation

});

button点击触发Ajax:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24


$(‘: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

});

});

处理进度:


1

2

3

4

5


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

时间: 2024-10-19 19:08:46

atitit.ajax上传文件的实现原理 与设计的相关文章

ajax上传文件的原理与实现

    ajax已经很普遍了,但使用 ajax上传文件自己却一直都没有涉及,我只知道挺复杂的,上传文件不同于上传一般的表单数据,必须特殊处理,知道一般ajax使用上传都是应用一个虚拟的iframe,但由于项目需要,在网上找了找,没想到找到了两个支持ajax上传文件的jquery插件,jquery.uploadify.js和dropzone.min.js两个都可以实现ajax上传文件,效果也不错. 1使用jquery.uploadify.js上传文件  这种上传方式,使用了Flash,因此需要引用

使用ajax上传文件

有时候我们需要在web端向服务器上传文件,以前是使用form的方式进行提交,html5中支持直接使用xmlhttprequest上传文件,send对象支持blob对象而文件就是一个blob对象 ajax上传文件 ajax中可以通过参数processData这个参数来控制data是否进行转换,我们将这个参数设置为false就可以使用ajax进行文件的上传操作了 example: $.ajax({ url: "your url", type: "POST", proce

闲话ajax,例ajax轮询,ajax上传文件

引语:ajax这门技术早已见怪不怪了,我本人也只是就自己真实的经验去总结一些不足道的话.供不是特别了解的朋友参考参考! 本来早就想写一篇关于ajax的文章的,但是前段时间一直很忙,就搁置了,趁着元旦放假,赶紧补上吧! ajax的出现,可以出给用户带来了很好的体验,证据如下: 1.感觉:以前要给用户呈现新的内容,就必须要刷新当前页面,结果往往是这样:用户看着看着,唰...,然后又重头看起,我那个去,这谁受得了; 自从有了ajax后,就是这样的,用户关注哪一块,变化哪一块,我们就更新那一块,完全看不

ajax上传文件

以往我用的上传文件都是Flex写的,最近html页面需要上传页面功能. 相比之下,比flex还是要麻烦一些,问题也多一些.这里记录下: ajax上传文件,我用到了ajaxfileupload.js修正版. <form id="addAttaForm" enctype="multipart/form-data"> <div class="row"> <label for="fileUpload"&g

【原创】AJAX上传文件,formdata表单提交问题

今天遇到一个特别神奇的问题,AJAX上传文件,formdata表单提交问题,后台显示无法获取上传文件. 排查许久发现是formdata.append();时,要先添加file,而后添加其他参数.方可正常工作. 可是却不知到底是和原因.去了火狐开发者社区也未能找到答案. 还望知道的大神赐教一二.

springMVC+jsp+ajax上传文件

工作中遇到的小问题,做个笔记 实现springMVC + jsp + ajax 上传文件 HTML <body> <form id="myform" method="post" > 登录名<input type="text" name="loginName" /> <br> 上传录音<input type="file" name="record

使用html5特性--ajax上传文件

在html5以前,ajax上传文件算是一个比较麻烦的事,要是想显示一下上传进度就更不容易.遇到这种情况往往需要借助于第三方插件,比如jquery.fileupload.js.如今html5已经技术已经变成一个非常流行.非常新潮的技术了,各个浏览器厂商也实现了不少的html5规范,如今文件上传有了html5的支持已经变的相当容易了,我自己尝试了一下用javascript原生的api来实现ajax上传文件,为了页面不至于太丑,我使用了bootstrap的一些组件,先上效果图: 实现的功能介绍: aj

用iFrame模拟Ajax上传文件

前段时间在解决ajax上传文件时折腾了好一阵.直接用$.post上传文本信息肯定是没有问题的.但是$.post直接上传图片是不可行的. 后来看到网上的一些解决方案,有现成的ajax上传文件的封装的方法也有利用flash的.flash确实是个好方法 但是不是每个人都会flash的而且下载下来现成的方法要做修改也不是件易事,且文件相对较大.最后只好模拟iframe来实现.发现相当的简单.泌阳县马奇建材 html: <iframe name="ajaxUpload" style=&qu

Ajax上传文件进度条显示

要实现进度条的显示,就要知道两个参数,上传的大小和总文件的大小 html5提供了一个上传过程事件,在上传过程中不断触发,然后用已上传的大 小/总大小,计算上传的百分比,然后用这个百分比控制div框的显示,就可以 实现上传的进度条效果 前端页面 <!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Ajax上传文件进度条显示