File杂文——拖拽上传前传
2015/07/24 · HTML5 ·
拖拽上传
原文出处: 百码山庄
在《File杂谈——初识file控件》一文中,大家早就对file控件有了启幕的问询,并且对成立一个视觉和体会一致的file控件做了较为详细的证实,前日我们继承刺探file控件的越来越多特点,并拉开出越多。
拖拽上传前传,拖拽异步上传完结。File杂文——拖拽异步上传完毕
2015/07/25 · HTML5 ·
异步上传
原稿出处: 百码山庄
在前一篇小说《File杂谈——拖拽上传前传》中本人制作了一个静态的拖拽上传界面,拖拽文件到显示区域释放,可以来得拖入文件的基本音讯。本文将在此基础上更为加工,创设一个完好的拖拽上传示例。
当大家在上传文件时一旦每一趟都要上盛传服务器才方可预览那么些做看上合理其实是不客观的,倘使网速慢或图片有问题,那样不仅浪费客户时间还要也浪费服务器资源了,上边大家介绍利用js上传图片时当地完结预览,希望此方法对各位有所辅助啊。
拖拽(Drag/Drop)是个特别常见的功力。你可以抓住一个对象,并且拖动到您想放置的区域。
很多javascript都就好像完毕了连带的功效,例如,jQueryUI的drag and
drop组件。在HTML5中,拖拽(drag and
drop)成为了正规操作,任何因素都协理。正因为这一个职能太常见了,所有的主流浏览器都协理这么些操作。
新增属性
在HTML5到来在此之前,绝半数以上情景下行使file控件,咱们前端工程师必要的有用音讯都只可以通过value属性得到的公文名字符串来收获(比如:文件类型、文件的直接名称等),这么些很不便宜,多文本上传的时候就特别勤奋了。其它,大家想不经过任何手段拿到上传文件的高低更是一种奢望。
可是,好在那总体并没有那么糟,随着HTML5的赶到,file控件上新增了files属性。该属性包涵了file控件选拔的文书对象集合,每一个文件对象涵盖了方今文件的中坚新闻(类型、名称、大小)等,那样一来大家再也不用利用正则啊,字符串拆分啊,等等麻烦的措施去拿到大家想要的音信了。下边我们在Chrome的主宰台看下files属性的布局。作者的测试方法是那样的:
先是,使用Chrome浏览器随便打开一个网页,然后F12调出开发工具,接着在Console中输入:
JavaScript
document.body.innerHTML = ‘<input type=”file” id=”J_File”>’; var
f = document.getElementById(‘J_File’); f.onchange = function() {
console.log(this.files); };
1
2
3
4
5
|
document.body.innerHTML = ‘<input type="file" id="J_File">’;
var f = document.getElementById(‘J_File’);
f.onchange = function() {
console.log(this.files);
};
|
此刻页面会被替换成一个file控件,点击拔取一个或四个(五个需求在input标签上平添multiple属性)本三步跳件,这时change事件将会被触发,控制台将会输出一下数量:
眼看,files属性的值是一个FileList类型的靶子,它和数组类似,同样享有length属性,而且我们也可以直接利用循环去获取每种文书(File)对象(例:取第三个公文就是files[0])。大家继续看逐个文件对象中包含的音讯,大家常用的name、size、type等一应俱全了,突然觉得好高大上。
不过,小编要告知大家的是,大家也不只怕横行霸道的施用file控件的files属性,因为它在IE9及以下版本的IE浏览器中是不设有的,大家要求动用别的的一手(flash等)来弥补这一个难点,那里就不开展了。
演示表达
点击区域接纳文件或直接将文件拖入区域,触发文件上传功效,文件将异步发送到服务器。待服务端处理到位后回来基本消息,在页面中突显。由于服务器体量难题,本示例未做文件保留处理,只是简短的将文件核心音讯再次来到,文件上传的后端具体处理逻辑必要活动补充。
原理
启用拖拽 – draggable属性
相当不难,只须要将一个因素的拖动属性修改为draggable,这几个元素就协理拖动了,如下所示:
file控件的身价碰着胁制
乘机files属性的产出,file控件的地位明显赢得了很好的晋升,不过那并不代表它的身价越来越稳固。随着HTML5二来的,并不唯有file控件的files属性。大家已经足以在一发多的网站上得以看来拖拽上传这几个一个风靡并且更契合用户作为的竞相成效。这里小编先不说拖拽上传效率的落到实处,我们先一起来看看另一种拿到FileList对象的章程。
率先,我们须要一个拖拽上传的静态界面,细节不多说,直接上代码:
XHTML
<style> * {margin: 0;padding: 0;} .up-area {margin: 50px
auto;border: 1px dashed #ccc;background-color: #eee;width:
600px;height: 400px;line-height: 400px;text-align: center;color:
#666;cursor: pointer;} .up-area:hover {background-color: #ddd;}
</style> <input type=”file” name=”” id=”J_UploadFile”
style=”display: none;”> <div class=”up-area”
id=”J_UploadArea”> 点击那里或拖入文件举行上传 </div>
<script> (function(){ var area =
document.getElementById(“J_UploadArea”), file =
document.getElementById(“J_UploadFile”); function uploadFile(fs) {
console.log(fs); } area.onclick = function() { console.log(‘click’);
file.click(); }; file.onchange = function() { uploadFile(this.files); };
area.ondragenter = function(ev) { this.className = ‘up-area hover’;
ev.preventDefault(); }; area.ondragover = function(ev) {
ev.preventDefault(); }; area.ondrop = function(ev) {
ev.preventDefault(); console.log(‘drop’); var dt = ev.dataTransfer;
this.className = ‘up-area’; uploadFile(dt.files); }; })();
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
<style>
* {margin: 0;padding: 0;}
.up-area {margin: 50px auto;border: 1px dashed #ccc;background-color: #eee;width: 600px;height: 400px;line-height: 400px;text-align: center;color: #666;cursor: pointer;}
.up-area:hover {background-color: #ddd;}
</style>
<input type="file" name="" id="J_UploadFile" style="display: none;">
<div class="up-area" id="J_UploadArea">
点击此处或拖入文件进行上传
</div>
<script>
(function(){
var area = document.getElementById("J_UploadArea"),
file = document.getElementById("J_UploadFile");
function uploadFile(fs) {
console.log(fs);
}
area.onclick = function() {
console.log(‘click’);
file.click();
};
file.onchange = function() {
uploadFile(this.files);
};
area.ondragenter = function(ev) {
this.className = ‘up-area hover’;
ev.preventDefault();
};
area.ondragover = function(ev) {
ev.preventDefault();
};
area.ondrop = function(ev) {
ev.preventDefault();
console.log(‘drop’);
var dt = ev.dataTransfer;
this.className = ‘up-area’;
uploadFile(dt.files);
};
})();
</script>
|
在线Demo。将文件拖入粉青区域释放便得以在页面上来看文件音信。
密切的情侣或然曾经意识了,其实大家那里又提供了优化file控件的别的一种格局——完全选取另一个标签替代,在该标签的click事件中主动触发file控件的click事件,正如上边代码中的: file.click() 。然则,那不是本文的紧要。
大家精心看上边代码中的最终一段,即ondrop的事件处理函数,大家的files对象并不是出自file控件,而是一个叫dataTransfer的东西。那么咱们是否可以大胆的估计,拖拽上传成效其实可以完全抛开file控件独立落成?那里先留个悬念,大家以后再议论。
在地方的案例中大家经过点击来接纳文件从而取得FileList对象,和透过将文件拖拽到紫浅莲灰区域来博取FileList对象,那三种方式虽不相同,但大家取得的数据确是同样的,那足以验证file控件不再独裁,它的身价已经逐步起头遇到要挟。
1 赞 1 收藏
评论
新的小伙伴FormData
咱俩领略,古板的公文上传假设要已毕异步的效能,大家会利用iframe去模拟,或应用flash上传插件。不过今日,我们又认识了一位新成员——FromData,它可以由此js创立表单对象,并可以向该对象中增进表单数据(字符串、数字、文件等)。再组成大家熟知的XMLHttpRequest对象,将表单数据异步提交到服务端,那样我们的标题就消除了。
上面,我们来看下宗旨代码:
JavaScript
function uploadFile(fs) { var len = fs.length; for (var i = 0; i <
len; i++) { sendFile(fs[i]); } } function sendFile(file) { var xhr =
new XMLHttpRequest(), fd = new FormData(); fd.append(‘file’, file);
xhr.onreadystatechange = function() { if (xhr.readyState == 4 &&
xhr.status == 200) { // 将服务端重回音讯输出到日志区(考虑多文本境况)
consoleDiv.innerHTML += ‘<br>’ + xhr.responseText; } };
xhr.open(‘POST’, ‘./upload.php’); xhr.send(fd); } //
文件控件暴发变化时,调用uploadFile函数,触发上传功效 file.onchange =
function() { uploadFile(this.files); }; //
在区域内刑释解教拖入文件时,调用文件上传函数 area.ondrop = function(ev) {
ev.preventDefault(); var dt = ev.dataTransfer; uploadFile(dt.files); };
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
function uploadFile(fs) {
var len = fs.length;
for (var i = 0; i < len; i++) {
sendFile(fs[i]);
}
}
function sendFile(file) {
var xhr = new XMLHttpRequest(),
fd = new FormData();
fd.append(‘file’, file);
xhr.onreadystatechange = function() {
if (xhr.readyState == 4 && xhr.status == 200) {
// 将服务端返回信息输出到日志区(考虑多文件情况)
consoleDiv.innerHTML += ‘<br>’ + xhr.responseText;
}
};
xhr.open(‘POST’, ‘./upload.php’);
xhr.send(fd);
}
// 文件控件发生变化时,调用uploadFile函数,触发上传功能
file.onchange = function() {
uploadFile(this.files);
};
// 在区域内释放拖入文件时,调用文件上传函数
area.ondrop = function(ev) {
ev.preventDefault();
var dt = ev.dataTransfer;
uploadFile(dt.files);
};
|
拖拽上传前传,拖拽异步上传完结。代码很简单,不再做过多演讲。可是此地本身想发布一点私有看法:按照示例大家简单窥见有如此一个题材——假诺用户都应用拖拽上传功效,而不应用点击触发File控件选择文件上传,那么File控件完全没有存在的不可或缺。联系上文中自个儿提到的File控件的身价遭逢吓唬这一理念,小编斗胆的考虑,假方今后的某一项正式中给种种HTMLElement暴光一个精选文件的成效接口,那么拖拽和点选作用将可以集于一个成分之上,到当下File控件的身份大概不仅仅是备受勒迫,很有只怕退出历史舞台!出于File控件视觉效果和互相不联合的角度去考虑,作者觉得以上推断依然有可能的,哈哈~~
尽管示例并未在后端做太多干活儿,笔者那边照旧以PHP为例,说多美滋(Dumex)(Beingmate)下后端该怎样工作。单从示例而言,作者的代码是这样的:
PHP
$file = $_FILES[‘file’]; echo json_encode($file);
1
2
|
$file = $_FILES[‘file’];
echo json_encode($file);
|
可以算得非凡不难了。而大家在实际上利用中屡屡还会波及越多更扑朔迷离的拍卖逻辑。最起码的我们应该要将tmp_name对应的临时文件移动到我们指定的上传目录吧。当然,这一进度大家就会对文件类型进行判定,大小限制,重命名,数据保存,等等。基本代码:
PHP
$file = $_FILES[‘file’]; $path = ‘./upload’; if ($file[‘size’] >
2000000) { echo ‘{“error”: “1000”, “message”:
“上传文件大小超限,不能够领先xxM”}’; } $path .= ‘/file_’ . time() .
‘.png’; // 那里还只怕会存在文件数量保存,新旧名称关联等逻辑
move_uploaded_file($file[‘tmp_name’], $path);
1
2
3
4
5
6
7
8
|
$file = $_FILES[‘file’];
$path = ‘./upload’;
if ($file[‘size’] > 2000000) {
echo ‘{"error": "1000", "message": "上传文件大小超限,不能超过xxM"}’;
}
$path .= ‘/file_’ . time() . ‘.png’;
// 这里还可能会存在文件数据保存,新旧名称关联等逻辑
move_uploaded_file($file[‘tmp_name’], $path);
|
分成两步:当上传图片的input被触发并精选当地图片之后拿到要上传的图片这一个目标的ULX570L(对象UTiggoL);把目的ULANDL赋值给事先写好的img标签的src属性即可把图片显示出来。
<img draggable=”true” />
一个神奇的方法sendAsBinary
前面大家聊到的应用FormData来已毕公文异步上传,在高级浏览器中都能正常运行,没有太大问题。接下来大家其它一个在Firefox完结异步上传的艺术。那个主意,大家又会付出一个新的爱侣——FireReader。FileReader是HTML5新增的一个对象,它可以访问用户本和姑件,并且可以以不一样格式读取文件内容。
在那边,大家必要了然Javascript里File对象、Blob对象和window.U中华VL.createObjectULANDL()方法。
拖动中数量的传递
FileReader基本使用
首先我们来看一下什么创制一个FileReader实例对象,以及它抱有如何实例方法。在js中创建一个FileReader对象很简短:
JavaScript
var reader = new FileReader();
1
|
var reader = new FileReader();
|
小编们得以因而reader对象访问当麻芋果件,那么reader对象拥有怎样我们常用的属性、事件和办法呢?请看以下列表:
File对象
拖动的历程中,大家一再须要传递相应的逻辑数据来成功更换的长河,那里紧如若运用dataTransfer对象开展数量传递,下边先看看它的分子:
方法成员:
事件
- onload :文件成功读完时触发
- onloadend :文件读完时触发,无论成功与否
- onloadstart :起头读取文件时接触
- onprogress :文件读取中,常用来获取读取进程
- onabort :文件读取操作停顿
- onerror :文件读取出错
File对象足以用来博取某个文件的消息,还足以用来读取那个文件的内容.常常景况下,File对象是发源用户在一个input成分上摘取文件后回去的FileList对象,也得以是来源于由拖放操作生成的
DataTransfer对象.
setData(format, data):把被拖动的数量赋值给dataTransfer对象。
属性
- result :读取到的文书内容,当读取操作已毕后生效
- readyState :FileReader对象的当下情形
- error :出错时的错误新闻
上面来看收获FileList对象:
format:一个String型参数,指定被拖动数据的品类。该参数取值可以是“Text”(文本类型)和“UOdysseyL”(UOdysseyL类型)。该参数是深浅写毫不相关的,所以传入”text”与”Text”是千篇一律的。
data:一个变体类型参数,指定被拖动的数目。该多少可以是文件,图片路径,ULX570L等等。
该函数有Boolean类型的重返值,true表示数据成功加到dataTransfer中,false代表不成功。假使须求,可以经过那一个参数来支配是还是不是合宜继续执行某些逻辑。
方法
- abort :中断文件读取操作
- readAsBinaryString :将文件内容读取为二进制格式
- readAsDataU奥德赛L :将文件内容读取为DataU昂科威L格式,平时所说的base64格式
- readAsText :将文件内容读取为文本
上述就是FileReader对象最常用的内容,下边大家先看一个小例子:
JavaScript
var rd = new FileReader(); rd.onload = function(ev) {
console.log(ev.target.result); }; rd.readAsText(file);
1
2
3
4
5
|
var rd = new FileReader();
rd.onload = function(ev) {
console.log(ev.target.result);
};
rd.readAsText(file);
|
如上代码中的file参数是一个file对象,可以使File控件的files属性中FileList的一个,也足以是dataTransfer中files属性中FileList的一个。
代码如下
getData(format):获取dataTransfer中存放的拖动数据。
FileReader + sendAsBinary完结异步上传
认识了FireReader,下边我们来看一下在Firefox中什么运用File里德r和XMLHttpRequest的sendAsBinary方法完毕公文异步上传。核心代码如下:
JavaScript
function sendByBinary(file) { var xhr = new XMLHttpRequest(), reader =
new FileReader(); xhr.onreadystatechange = function() { if
(xhr.readyState == 4 && xhr.status == 200) { consoleDiv.innerHTML +=
‘<br>’ + xhr.responseText; } }; xhr.overrideMimeType(‘text/plain;
charset=x-user-defined-binary’); xhr.open(‘POST’, ‘./upload.php’);
reader.onload = function(ev) { // 将二进制内容发送至服务端
xhr.sendAsBinary(ev.target.result); }; // 将文件内容读取为二进制格式
reader.readAsBinaryString(file); }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
function sendByBinary(file) {
var xhr = new XMLHttpRequest(),
reader = new FileReader();
xhr.onreadystatechange = function() {
if (xhr.readyState == 4 && xhr.status == 200) {
consoleDiv.innerHTML += ‘<br>’ + xhr.responseText;
}
};
xhr.overrideMimeType(‘text/plain; charset=x-user-defined-binary’);
xhr.open(‘POST’, ‘./upload.php’);
reader.onload = function(ev) {
// 将二进制内容发送至服务端
xhr.sendAsBinary(ev.target.result);
};
// 将文件内容读取为二进制格式
reader.readAsBinaryString(file);
}
|
代码很粗略,跟FormData的艺术大多,我们随后看服务端将怎样取得POST过去的文书内容(以PHP为例):
PHP
// 方法一,那么些方法要求php.ini开启辅助 $content =
$GLOBALS[‘HTTP_RAW_POST_DATA’]; //
方法二,不需求php.ini设置,内存压力小 $content =
file_get_contents(‘php://input’);
1
2
3
4
5
|
// 方法一,这个方法需要php.ini开启支持
$content = $GLOBALS[‘HTTP_RAW_POST_DATA’];
// 方法二,不需要php.ini设置,内存压力小
$content = file_get_contents(‘php://input’);
|
之所以综合起来比较保证的不二法门:
PHP
$content = $GLOBALS[‘HTTP_RAW_POST_DATA’]; if (empty($content)) {
$content = file_get_contents(‘php://input’); } echo $content; //
输出文件内容
1
2
3
4
5
|
$content = $GLOBALS[‘HTTP_RAW_POST_DATA’];
if (empty($content)) {
$content = file_get_contents(‘php://input’);
}
echo $content; // 输出文件内容
|
笔者们暂且不说sendAsBinary那种方法当下唯有Firefox支持,单从服务器得到文件内容后该如何处理的话,那种措施肯定尚无使用FormData的艺术有优势。因为服务端仅仅拿到了文件内容,并不曾文件类型和尺寸等音信,对部分范围逻辑和文书存储的完毕很不和谐。
1 赞 2 收藏
评论
复制代码
format意义与setData中的一样,取值可以是”Text”(文本类型)和”U路虎极光L”(UENVISIONL类型)。
<script type=”text/javascript” src=”jquery.js”></script>
clearData(format):移除指定项目标数码。
<input id=”upload” type=”file”>
<img id=”preview” src=””>
那里的format除了上边能够指定的”Text”(文本类型)和”UPAJEROL”(UHavalL类型)外,仍能取下列值:file
<script type=”text/javascript”>
$(‘#upload’).change(function(){
// 获取FileList的率先个要素
alert(document.getelementbyid(‘upload’).files[0]);
});
</script>
- 文件,html – html元素,image – 图片。
那个艺术可以用来去选取性的处理拖动的数据类型。
Blob对象
本性成员:
一个Blob对象就是一个带有有只读原始数据的类公事对象.Blob对象中的数据并不一定得是JavaScript中的原生格局.File接口基于Blob,继承了Blob的机能,并且扩展帮衬了用户电脑上的地面文件.
effectAllowed:设置或获取数据源元素中的数据足以实施的操作。
笔者们想要拿到的靶子URubiconL实际上就是从Blob那些目的拿到的,因为File的接口继承Blob。上边就来把Blob对象转换成U福睿斯L:
属性类型为字符串,取值范围如下:
“copy”-复制数据.
“link”-链接数据.
“move”-移动多少
“copyLink”-复制或链接数据,由目的对象来确定。
“copyMove”-复制或挪动多少,由目的对象来规定。
“linkMove”-链接或活动多少,由目标对象来规定。
“all”-所有的操作都以永葆的。
“none”-禁止拖动。
“uninitialized”-暗中认同值,选取暗中同意的一坐一起。
注意设置effectAllowed为none以往,拖动是禁止的,可是鼠标形状仍旧显得没有可拖动的目标的形状,若是想不出示那么些鼠标形状,则要求将window的event事件的属性returnValue设置为false。
代码如下
dropEffect:设置或得到拖动的靶子上同意的操作以及相关的鼠标形状。
复制代码
属性类型为字符串,取值范围如下:
“copy”-鼠标呈现为复制时的形象;
“link”-鼠标突显为连日来的模样;
“move”-鼠标彰显为活动的形态。
“none”(暗中认同值)-鼠标显示为没有拖动的造型。
effectAllowed指定了数据源帮助的操作,所以平日在ondragstart事件中指定。dropEffect指定了拖动放置的对象援助的操作,所以与effectAllowed协作,平时在拖动的靶子上的
ondragenter, ondragover和ondrop等事件中行使。
<script type=”text/javascript”>
var f = document.getelementbyid(‘upload’).files[0];
var src = window.URL.createObjectURL(f);
document.getElementById(‘preview’).src = src;
</script>
files:再次来到拖动的文件的列表FileList。
types:ondragstart中发送的数据(被拖动的数量)类型的列表。
一个相比完整的实例
dataTransfer对象的存在,使得在拖动的数据源和目的元素之间传递逻辑数据变成了大概。经常我们应用setData方法在数额源成分的ondragstart事件中提供数据,然后再目的元素中,使用getData方法获取数据。
代码如下
拖动中触发的轩然大波
上边是四次拖拽会发出的事件,基本上事件的接触顺序约等于上面的次第:
复制代码
dragstart:要被拖拽的因素开端拖拽时接触,这几个事件目的是被拖拽成分。
drag:拖拽成分时接触,那些事件目的是被拖拽成分。
dragenter:拖拽成分进入目的成分时接触,那个事件目的是目的元素。
dragover:拖拽某成分在对象成分上移动时接触,那一个事件目的是目的成分。
dragleave:拖拽某成分离开目的成分时接触,那么些事件目标是目的成分。
drop:将被拖拽成分放在目的成分内时触发,那一个事件目的是目的成分。
dragend:在drop之后触发,就是拖拽达成时触发,那几个事件目标是被拖拽成分。
<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN”
“;
<html xmlns=”;
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″
/>
<title>HTML5 Upload</title>
<style type=”text/css”>
#destination{
filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(true,sizingMethod=scale);
}
</style>
基本上事件的参数event都会流传相关的成分,可以很有益于的举行部分修改。那里,大家并不须求处理各个事件,寻常只要求挂接主要的多少个事件即可。
<!–<script type=”text/javascript”
src=”;
<script type=”text/javascript”
src=”;
<script type=”text/javascript”>
//处理file input加载的图纸文件
$(document).ready(function(e) {
//判断浏览器是还是不是有FileReader接口
if(typeof FileReader ==’undefined’)
{
$(“#destination”).css({‘background’:’none’}).html(‘亲,您的浏览器还不协理HTML5的FileReader接口,不只怕运用图片本地预览,请更新浏览器得到最好体验’);
//假诺浏览器是ie
if($.browser.msie===true)
{
//ie6直接用file input的value值本地预览
if($.browser.version==6)
{
$(“#imgUpload”).change(function(event){
//ie6下如何做图片格式判断?
var src = event.target.value;
//var src = document.selection.createRange().text; //选中后
selection对象就时有发生了 那一个目的只适合ie
var img = ‘<img src=”‘+src+'” width=”200px” height=”200px”
/>’;
$(“#destination”).empty().append(img);
});
}
//ie7,8行使滤镜本地预览
else if($.browser.version==7 || $.browser.version==8)
{
$(“#imgUpload”).change(function(event){
$(event.target).select();
var src = document.selection.createRange().text;
var dom = document.getElementById(‘destination’);
//使用滤镜 成功率高
dom.filters.item(‘DXImageTransform.Microsoft.AlphaImageLoader’).src=
src;
dom.innerHTML = ”;
//使用和ie6相同的不二法门 设置src为相对路径的不二法门 有些图片不能显示效果没有运用滤镜好
/*var img = ‘<img src=”‘+src+'” width=”200px” height=”200px”
/>’;
$(“#destination”).empty().append(img);*/
});
}
}
//假若是不扶助FileReader接口的低版本firefox 可以用getAsDataU奥迪Q5L接口
else if($.browser.mozilla===true)
{
$(“#imgUpload”).change(function(event){
//firefox2.0不曾event.target.files那么些属性 似乎ie6那样选用value值
可是firefox2.0不扶助相对路径嵌入图片 废弃firefox2.0
//firefox3.0初阶具有event.target.files这一个属性
并且先导协助getAsDataUQX56L()这一个接口 平素到firefox7.0了结
但是事后都得以用HTML5的FileReader接口了
if(event.target.files)
{
//console.log(event.target.files);
for(var i=0;i<event.target.files.length;i++)
{
var img = ‘<img
src=”‘+event.target.files.item(i).getAsDataURL()+'” width=”200px”
height=”200px”/>’;
$(“#destination”).empty().append(img);
}
}
else
{
//console.log(event.target.value);
//$(“#imgPreview”).attr({‘src’:event.target.value});
}
});
}
}
else
{
// version 1
/*$(“#imgUpload”).change(function(e){
var file = e.target.files[0];
var fReader = new FileReader();
//console.log(fReader);
//console.log(file);
fReader.onload=(function(var_file)
{
return function(e)
{
$(“#imgPreview”).attr({‘src’:e.target.result,’alt’:var_file.name});
}
})(file);
fReader.readAsDataURL(file);
});*/
//单图上传 version 2
/*$(“#imgUpload”).change(function(e){
var file = e.target.files[0];
var reader = new FileReader();
reader.onload = function(e){
//displayImage($(‘bd’),e.target.result);
//alert(‘load’);
$(“#imgPreview”).attr({‘src’:e.target.result});
}
reader.readAsDataURL(file);
});*/
//多图上传 input file控件里指定multiple属性 e.target是dom类型
$(“#imgUpload”).change(function(e){
for(var i=0;i<e.target.files.length;i++)
{
var file = e.target.files.item(i);
//允许文件MIME类型 也得以在input标签中指定accept属性
//console.log(/^image/.*$/i.test(file.type));
if(!(/^image/.*$/i.test(file.type)))
{
continue; //不是图片 就跳出那三次巡回
}
//实例化FileReader API
var freader = new FileReader();
freader.readAsDataURL(file);
freader.onload=function(e)
{
var img = ‘<img src=”‘+e.target.result+'” width=”200px”
height=”200px”/>’;
$(“#destination”).empty().append(img);
}
}
});
//处理图片拖拽的代码
var destDom = document.getElementById(‘destination’);
destDom.addEventListener(‘dragover’,function(event){
event.stopPropagation();
event.preventDefault();
},false);
destDom.addEventListener(‘drop’,function(event){
event.stopPropagation();
event.preventDefault();
var img_file =
event.dataTransfer.files.item(0); //获取拖拽过来的文本消息暂时取一个
//console.log(event.dataTransfer.files.item(0).type);
if(!(/^image/.*$/.test(img_file.type)))
{
alert(‘您还未拖拽任何图片过来,恐怕你拖拽的不是图形文件’);
return false;
}
fReader = new FileReader();
fReader.readAsDataURL(img_file);
fReader.onload = function(event){
destDom.innerHTML=”;
destDom.innerHTML = ‘<img src=”‘+event.target.result+'”
width=”200px” height=”200px”/>’;
};
},false);
}
});
</script>
</head>
拖动初叶 – ondragstart事件
从那一个事件传入的参数含有的音讯卓殊丰裕,从中可以很方便的获取到被拖动的要素(event.Target);从中可以安装被拖动数据(event.dataTransfer.setData);所以您可以很有利达成拖动的暗中逻辑(当然你绑定的时候也得以传递其他的参数)。
拖动进程中 – ondrag,ondragover,ondragenter和ondragleave事件
ondrag事件的目的是被拖拽成分,常常那些事件处理的可比少。ondragenter事件是当拖动进入当前因素时爆发,ondragleave事件是在当拖动离开当前成分时暴发,ondragover事件是在拖动在脚下因素中移动时发出。
那里只须要留意一点,因为暗中同意情形下,浏览器是明令禁止成分drop的,所以为了让要素得以drop,要求在那几个函数中回到false只怕调用event.preventDefault()方法。如上边的例证所示。
拖动为止 – ondrop,ondragend事件
当可拖动的数目被drop的时候,drop事件触发。drop为止后,dragend事件被触发,这几个事件选取的也相对少一点。
<body>
<input type=”file” id=”imgUpload” name=”imgUpload” draggable=”true”
single/> <!–允许file控件接受的文件类型–>
<!–<input type=”file” id=”imgUpload” name=”imgUpload”
accept=”image/*” multiple/>–>
<div id=”destination” style=”width:200px;height:200px;border:1px
solid #000000;”><img src=”nopic.jpg” /></div>
</body>
</html>
看一个简短的例证:
兼容性
<!DOCTYPE HTML>
<html>
<head>
<script type=”text/javascript”>
function allowDrop(ev){
ev.preventDefault();
}
function drag(ev){
ev.dataTransfer.setData(“Text”,ev.target.id);
}
function drop(ev){
var data=ev.dataTransfer.getData(“Text”);
ev.target.appendChild(document.getElementById(data));
ev.preventDefault();
}
</script>
</head>
<body>
<div id=”div1″ ondrop=”drop(event)” ondragover=”allowDrop(event)”></div>
<img id=”drag1″ src=”img_logo.gif” draggable=”true” ondragstart=”drag(event)” width=”336″ height=”69″ />
</body>
</html>
•上述措施适用于chrome浏览器
•若是是IE浏览器可以直接利用input的value来代替src
•网上查阅资料有向来动用File对象的getAsDataU奔驰G级L()方法拿到U奥迪Q7L的,今后那个艺术都早已打消,类似的还有getAsText()和getAsBinary()方法;
…
文件拖拽
上边的例证已经使用了dataTransfer的各类措施和天性,上边再看网上的其它一个诙谐的使用:拖拽一个图纸到网页上,然后在网页上体现。这一个应用使用了dataTransfer的files属性。
<!DOCTYPE HTML>
<html>
<head>
<meta charset=”utf-8″>
<title>HTML5拖放文件</title>
<style>
#section{font-family: “Georgia”, “微软雅黑”, “华文中宋”;}
.container{display:inline-block;min-height:200px;min-width:360px;color:#f30;padding:30px;border:3px solid #ddd;-moz-border-radius:10px;-webkit-border-radius:10px;border-radius:10px;}
.preview{max-width:360px;}
#files-list{position:absolute;top:0;left:500px;}
#list{width:460px;}
#list .preview{max-width:250px;}
#list p{color:#888;font-size:12px;}
#list .green{color:#09c;}
</style>
</head>
<body>
<div id=”section”>
<p>把您的图片拖到下边的器皿内:</p>
<div id=”container” class=”container”>
</div>
<div id =”files-list”>
<p>已经拖进过来的文本:</p>
<ul id=”list”></ul>
</div>
</div>
<script>
if (window.FileReader) {
var list = document.getElementById(‘list’),
cnt = document.getElementById(‘container’);
// 判断是或不是图片
function isImage(type) {
switch (type) {
case ‘image/jpeg’:
case ‘image/png’:
case ‘image/gif’:
case ‘image/bmp’:
case ‘image/jpg’:
皇家赌场手机版, return true;
default:
return false;
}
}
// 处理拖放文件列表
function handleFileSelect(evt) {
evt.stopPropagation();
evt.preventDefault();
var files = evt.dataTransfer.files;
for (var i = 0, f; f = files[i]; i++) {
var t = f.type ? f.type : ‘n/a’,
reader = new FileReader(),
looks = function (f, img) {
list.innerHTML += ‘<li><strong>’ + f.name + ‘</strong> (‘ + t +
‘) – ‘ + f.size + ‘ bytes<p>’ + img + ‘</p></li>’;
cnt.innerHTML = img;
},
isImg = isImage(t),
img;
// 处理拿到的图形
if (isImg) {
reader.onload = (function (theFile) {
return function (e) {
img = ‘<img class=”preview” src=”‘ + e.target.result + ‘” title=”‘ + theFile.name + ‘”/>’;
looks(theFile, img);
};
})(f)
reader.readAsDataURL(f);
} else {
img = ‘”o((>ω< ))o”,你传进来的不是图表!!’;
looks(f, img);
}
}
}
// 处理插入拖出作用
function handleDragEnter(evt){ this.setAttribute(‘style’, ‘border-style:dashed;’); }
function handleDragLeave(evt){ this.setAttribute(‘style’, ”); }
// 处理公事拖入事件,幸免浏览器暗中同意事件带来的重定向
function handleDragOver(evt) {
evt.stopPropagation();
evt.preventDefault();
}
cnt.addEventListener(‘dragenter’, handleDragEnter, false);
cnt.addEventListener(‘dragover’, handleDragOver, false);
cnt.addEventListener(‘drop’, handleFileSelect, false);
cnt.addEventListener(‘dragleave’, handleDragLeave, false);
} else {
document.getElementById(‘section’).innerHTML = ‘你的浏览器不扶助啊,同学’;
}
</script>
</body>
</html>
这些例子中应用了html5中的文件读取API:FileReader对象;该对象提供了下列异步方法用于读取文件:
- FileReader.readAsBinaryString(fileBlob)
以二进制的形式读取文件,result 属性会包罗一个文件的二进制的格式 - FileReader.readAsText(fileBlob, opt_encoding)
以文件的主意读取文件, result
属性将会蕴藏一个文本的文本格式,默许解码参数是 “utf-8”。 - FileReader.readAsDataURL(file)
以U普拉多L方式读取文件result 将会包罗一个文书的 DataU宝马X5L
格式(图片平常用那种方式)。
当使用方面的点子读取文件后,会接触下列事件:
onloadstart,onprogress,onabort,onerror,onload,onloadend
那一个事件都很不难,须求的时候挂接就能够了。看上面的代码示例:
function startRead() {
// obtain input element through DOM
var file = document.getElementById(‘file’).files[0];
if(file){
getAsText(file);
}
}
function getAsText(readFile) {
var reader = new FileReader();
// Read file into memory as UTF-16
reader.readAsText(readFile, “UTF-16”);
// Handle progress, success, and errors
reader.onprogress = updateProgress;
reader.onload = loaded;
reader.onerror = errorHandler;
}
function updateProgress(evt) {
if (evt.lengthComputable) {
// evt.loaded and evt.total are ProgressEvent properties
var loaded = (evt.loaded / evt.total);
if (loaded < 1) {
// Increase the prog bar length
// style.width = (loaded * 200) + “px”;
}
}
}
function loaded(evt) {
// Obtain the read file data
var fileString = evt.target.result;
// Handle UTF-16 file dump
if(utils.regexp.isChinese(fileString)) {
//Chinese Characters + Name validation
}
else {
// run other charset test
}
// xhr.send(fileString)
}
function errorHandler(evt) {
if(evt.target.error.name == “NotReadableErr”) {
// The file could not be read
}
}
这里也几乎说一下:普通的文本下载使用的就是window.open方法,例如:
window.open(”)
实用参考: 法定文档:
一个不错的教程网站:
MSDN帮助:
文件拖拽详述:
文件拖拽并上传:
文件拖拽上传完整例子:
文件下载的例子:
window.open攻略:
window.open参数: