昨天我们介绍了一款HTML5文件上传的jQuery插件:jQuery HTML5 uploader,今天我们将开发一个简单的叫upload center的图片上传程序,允许用户使用拖拽方式来上传电脑上的图片,使用现在浏览器支持新的HTML5 API。

图片将会有一个预览和进度条,都由客户端控制。目前,图片都保存在服务器上的一个目录里,当然你可以自己加强相关功能。

在线演示  在线下载

什么是HTML文件上传?

使用HTML5上传文件其实综合使用了3种技术,新的File Reader API,还有新的Drag&Drop API,以及AJAX技术(包含2进制的数据传输)。这里是一个简单HTML5文件的描述:

1. 用户拖放一个或者多个文件到浏览器的窗口。支持Drap&Drop API的浏览器将会触发一个事件,以及相关的其它信息,包括一个拖拽文件列表。

2. 使用File Reader API, 我们以2进制方式读取文件,保存在内存中。

3. 使用XMLHttpRequest的新sendAsBinary方法 ,发送文件数据到服务器。

听起来是不是有点复杂?是的,可以使用一些优化。幸运的是,这里有些jQuery的插件可以帮助我们。其中有个插件叫Filedrop,是一个实现这个功能的插件,提供了限制最大文件体积和指定擦llback的特性,这些特性对于你整合这些功能非常有帮助。

目前文件上传功能只能在FirefoxChrome上正常工作,但是将发布的主流浏览器也会支持这些功能。一个简单的fallback解决方案是显示一个一般的文件上传对话框。但是今天我们这里例子讲不这样设计,我们专注于HTML5的使用。

我们开始正式开发!

HTML代码

这个上传程序的html非常简单。我们使用一个一般的HTML5文档,包括了script.js文件,Filedrop插件和jQuery类库。

index.html

<!DOCTYPE html>
<html><head><meta charset="utf-8" /><title>HTML5 File Drag and Drop Upload with jQuery and PHP | Tutorialzine Demo</title><!-- Our CSS stylesheet file --><link rel="stylesheet" href="assets/css/styles.css" /><!--[if lt IE 9]><script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script><![endif]--></head><body><header><h1>HTML5 File Upload with jQuery and PHP</h1></header><div id="dropbox"><span class="message">Drop images here to upload. <br /><i>(they will only be visible to you)</i></span></div><!-- Including The jQuery Library --><script src="http://code.jquery.com/jquery-1.6.3.min.js"></script><!-- Including the HTML5 Uploader plugin --><script src="assets/js/jquery.filedrop.js"></script><!-- The main script file --><script src="assets/js/script.js"></script></body>
</html>

和Filedrop有关的唯一一个div是#dropbox。我们将这个元素传入插件。插件将会判断是否一个文件被拖放到上面。当发现有错误的时候信息span将会被更新(例如,如果浏览器不支持和这个应用有关的HTML5 API的时候)。

最后,当你拖放一个文件,我们的jQuery代码将会显示一个预览,如下:

<div class="preview done"><span class="imageHolder"><img src="" /><span class="uploaded"></span></span><div class="progressHolder"><div class="progress"></div></div></div>

以上代码片断包含了一个图片预览和一个进度条。整个预览带有".done" class,可以让".upload" span显示。这个span将有绿色的背景标示,暗示上传完成了。

接下来,我们看看script.js文件!

jQuery代码

所有的实际文件传送功能都由Filedrop插件完成,我们只是简单的调用并且设置擦llback,因此我们可以直接使用。我们将在下一个部分书写一个PHP脚本处理服务器段的文件上传功能。

第一个步骤是书写一个辅助功能接受一个文件对象(一个特别的由浏览器创建的对象,包含名字,路径和大小)。以及预览的标签。

var template = '<div class="preview">'+'<span class="imageHolder">'+'<img />'+'<span class="uploaded"></span>'+'</span>'+'<div class="progressHolder">'+'<div class="progress"></div>'+'</div>'+'</div>'; function createImage(file){var preview = $(template),image = $('img', preview);var reader = new FileReader();image.width = 100;image.height = 100;reader.onload = function(e){// e.target.result holds the DataURL which// can be used as a source of the image:image.attr('src',e.target.result);};// Reading the file as a DataURL. When finished,// this will trigger the onload function above:reader.readAsDataURL(file);message.hide();preview.appendTo(dropbox);// Associating a preview container// with the file, using jQuery's $.data():$.data(file,preview);}

template变量包含了HTML5的预览标签。我们得到图片的DataURL并且添加为图片源。每一个都被添加到dropbox容器里。

现在我们调用filedrop插件:

$(function(){var dropbox = $('#dropbox'),message = $('.message', dropbox);dropbox.filedrop({// The name of the $_FILES entry:paramname:'pic',maxfiles: 5,maxfilesize: 2, // in mburl: 'post_file.php',uploadFinished:function(i,file,response){$.data(file).addClass('done');// response is the JSON object that post_file.php returns},error: function(err, file) {switch(err) {case 'BrowserNotSupported':showMessage('Your browser does not support HTML5 file uploads!');break;case 'TooManyFiles':alert('Too many files! Please select 5 at most!');break;case 'FileTooLarge':alert(file.name+' is too large! Please upload files up to 2mb.');break;default:break;}},// Called before each upload is startedbeforeEach: function(file){if(!file.type.match(/^image//)){alert('Only images are allowed!');// Returning false will cause the// file to be rejectedreturn false;}},uploadStarted:function(i, file, len){createImage(file);},progressUpdated: function(i, file, progress) {$.data(file).find('.progress').width(progress);}});var template = '...'; function createImage(file){// ... see above ...}function showMessage(msg){message.html(msg);}});

使用这个,每一个正确的图片文件被拖放到#dropbox div都会被上传到post_file.php。

PHP Code

PHP这边的代码,和一般的表单上传没有太多区别。 这意味着你可以简单的提供fallback来重用后台功能。

// If you want to ignore the uploaded files,
// set $demo_mode to true;$demo_mode = false;
$upload_dir = 'uploads/';
$allowed_ext = array('jpg','jpeg','png','gif');if(strtolower($_SERVER['REQUEST_METHOD']) != 'post'){exit_status('Error! Wrong HTTP method!');
}if(array_key_exists('pic',$_FILES) && $_FILES['pic']['error'] == 0 ){$pic = $_FILES['pic'];if(!in_array(get_extension($pic['name']),$allowed_ext)){exit_status('Only '.implode(',',$allowed_ext).' files are allowed!');}   if($demo_mode){// File uploads are ignored. We only log them.$line = implode('        ', array( date('r'), $_SERVER['REMOTE_ADDR'], $pic['size'], $pic['name']));file_put_contents('log.txt', $line.PHP_EOL, FILE_APPEND);exit_status('Uploads are ignored in demo mode.');}// Move the uploaded file from the temporary// directory to the uploads folder:if(move_uploaded_file($pic['tmp_name'], $upload_dir.$pic['name'])){exit_status('File was uploaded successfuly!');}}exit_status('Something went wrong with your upload!');// Helper functionsfunction exit_status($str){echo json_encode(array('status'=>$str));exit;
}function get_extension($file_name){$ext = explode('.', $file_name);$ext = array_pop($ext);return strtolower($ext);
}

这段代码运行一些http检查,并且验证文件扩展。我们不想保存任何文件,所以这个我们直接删除。

CSS代码

/*-------------------------Dropbox Element
--------------------------*/#dropbox{background:url('../img/background_tile_3.jpg');border-radius:3px;position: relative;margin:80px auto 90px;min-height: 290px;overflow: hidden;padding-bottom: 40px;width: 990px;box-shadow:0 0 4px rgba(0,0,0,0.3) inset,0 -3px 2px rgba(0,0,0,0.1);
}#dropbox .message{font-size: 11px;text-align: center;padding-top:160px;display: block;
}#dropbox .message i{color:#ccc;font-size:10px;
}#dropbox:before{border-radius:3px 3px 0 0;
}/*-------------------------Image Previews
--------------------------*/#dropbox .preview{width:245px;height: 215px;float:left;margin: 55px 0 0 60px;position: relative;text-align: center;
}#dropbox .preview img{max-width: 240px;max-height:180px;border:3px solid #fff;display: block;box-shadow:0 0 2px #000;
}#dropbox .imageHolder{display: inline-block;position:relative;
}#dropbox .uploaded{position: absolute;top:0;left:0;height:100%;width:100%;background: url('../img/done.png') no-repeat center center rgba(255,255,255,0.5);display: none;
}#dropbox .preview.done .uploaded{display: block;
}/*-------------------------Progress Bars
--------------------------*/#dropbox .progressHolder{position: absolute;background-color:#252f38;height:12px;width:100%;left:0;bottom: 0;box-shadow:0 0 2px #000;
}#dropbox .progress{background-color:#2586d0;position: absolute;height:100%;left:0;width:0;box-shadow: 0 0 1px rgba(255, 255, 255, 0.4) inset;-moz-transition:0.25s;-webkit-transition:0.25s;-o-transition:0.25s;transition:0.25s;
}#dropbox .preview.done .progress{width:100% !important;
}

.progress div是绝对定位的。修改width用来做一个自然进度的标示。使用0.25 突然四体on,你会看到一个动画的增量效果。

全部代码完毕。

大家可以用这个教程做为HTML5的文件上传服务的起点。有任何建议或者评论,只给我们在下方留言。

via 使用jQuery开发一个基于HTML5的漂亮图片拖拽上传web应用

来源: http://www.starming.com/index.php?action=plugin&v=wave&tpl=union&ac=viewgrouppost&gid=34464&tid=17975

使用jQuery开发一个基于HTML5的漂亮图片拖拽上传web应用相关推荐

  1. dropzone.js php,Laravel 5.1 中基于 Dropzone.js 实现图片拖拽上传及删除功能

    注:本教程代码适用于Laravel 5.1版本. 1.概述 Dropzone 是目前最好的免费文件拖拽上传库,它拥有很多特性和选项以便你可以使用多种方式来自定义. 在Laravel项目集成Dropzo ...

  2. html ajax打包成app,利用HTML5与ajax完成拖拽上传文件

    前言 基于ajax的异步模式的上传控件,基本功能如下: 拖拽上传(利用HTML5新增特定 拖拽事件 以及 event的dataTransfer属性) 单文件/多文件切换(利用php实现单/多文件上传) ...

  3. html5之多文件拖拽上传预览

    最近对于html5预览功能很是感兴趣,特地拿出来研究一小下,并以一个小项目举例讲解. h5中的input有个type=file 就是文件上传控件,有个属性multiple就是h5新增的支持多选上传文件 ...

  4. 类似新浪微博和google图片的HTML5实现图片拖拽上传功能

    2019独角兽企业重金招聘Python工程师标准>>> 来源: http://www.lovesunlife.com/?p=315 这篇文章对google图片为蓝本就拖拽上传功能分析 ...

  5. html原生上传,一个基于HTML5及原生JS的文件上传组件--JohnUploader

    运行效果图 一.组件介绍 基本特点 基于HTML5的FileReader和FormData 可以完成多文件选择,并预览 完成文件的异步上传 原生XHR对象,适配多浏览器 代码 class JohnUp ...

  6. dropzonejs中文翻译手册 DropzoneJS是一个提供文件拖拽上传并且提供图片预览的开源类库....

    http://wxb.github.io/dropzonejs.com.zh-CN/dropzonezh-CN/ 由于项目需要,完成一个web的图片拖拽上传,也就顺便学习和了解了一下前端的比较新的技术 ...

  7. Nodejs express、html5实现拖拽上传(转载)

    一.前言 文件上传是一 个比较常见的功能,传统的选择方式的上传比较麻烦,需要先点击上传按钮,然后再找到文件的路径,然后上传.给用户体验带来很大问题.html5开始支持拖 拽上传的需要的api.node ...

  8. 拖拽上传技术-----html5[转载]

    原网址:http://blog.163.com/mongying_net/blog/static/35112712012345352226/ 拖拽上传应用主要使用了以下HTML5技术: Drag&am ...

  9. html5 上传超大文件,HTML5教程 如何拖拽上传大文件

    本篇教程探讨了HTML5教程 如何拖拽上传大文件,希望阅读本篇文章以后大家有所收获,帮助大家HTML5+CSS3从入门到精通 . < 前言: 大文件传输一直是技术上的一大难点.文件过大时,一些性 ...

最新文章

  1. linux comm 12,Linux comm命令
  2. 6月第3周回顾:广东清查ADSL共享 火狐3掀起浏览器大战
  3. JavaScript(JS)中与正则表达式有关的方法介绍
  4. 在OOW2009上寻宝撞大运续(床上篇)
  5. 数据库管理工具:如何使用 Navicat Premium 转储(导出)和运行(导入)*.sql 文件?
  6. 二分匹配最大匹配的理解(附图解)
  7. MYSQL的索引类型:PRIMARY, INDEX,UNIQUE,FULLTEXT,SPAIAL 有什么区别?各适用于什么场合?
  8. idle点开没反应_翟天临、靳东,一个人越是没文化越是喜欢装
  9. 3D数学之柏林噪声(Perlin Noise)
  10. jmeter接口测试json详解
  11. nginx启动vue_nginx下部署vue项目的方法步骤
  12. 【LaTeX 教程】03. LaTeX 字体字号设置
  13. 中兴服务器iSAC接口默认账号密码和IP
  14. python处理wps表格数据匹配_wps2个excel表格数据匹配-Wps表格怎么自动匹配我需要的数值...
  15. MFC—显示NX图标或透明背景图标
  16. js动态添加修改删除元素
  17. 蓝牙MESH网关_相对于米家多模网关,其实我更爱的是光照传感器
  18. 成为域名代理商好不好?域名代理商赚钱吗?
  19. 2011夏天的那点事儿 ~~乌镇雷峰塔普陀山千
  20. Android 开发环境搭建

热门文章

  1. 46 SD配置-销售凭证设置-分配状态参数文件到项目类型
  2. saiku连mysql 使用_saiku应用的调试
  3. canvas绘制竖排的数字_Python绘制可爱的卡通人物 | 【turtle使用】
  4. 机器学习--弹性网络(Elastic-Net Regression)
  5. OpenGL:关于获取渲染结果的深度信息的问题
  6. numpy 数组访问方式_索引、切片、迭代
  7. Docker 镜像使用(拉取、查看、使用、删除)
  8. num_workers设置
  9. linux 下后台运行python脚本
  10. python简写匹配_Python简写