`
天梯梦
  • 浏览: 13730588 次
  • 性别: Icon_minigender_2
  • 来自: 洛杉矶
社区版块
存档分类
最新评论

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

 
阅读更多

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

 

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

 

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

在线演示  在线下载

 

 

什么是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开发一个基于HTML5的漂亮图片拖拽上传web应用

 

最后,当你拖放一个文件,我们的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 mb
		url: '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 started
		beforeEach: function(file){
			if(!file.type.match(/^image//)){
				alert('Only images are allowed!');

				// Returning false will cause the
				// file to be rejected
				return 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。

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

 

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 functions

function 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

 

 

 

 

分享到:
评论

相关推荐

    构建实时Web应用(基于HTML5 WebSocket、PHP和jQuery)

    在现代Web开发中,实时通信已经成为一个不可或缺的功能,特别是在构建互动性强、响应迅速的应用时。本文将深入探讨如何使用HTML5的WebSocket协议、PHP后端处理以及jQuery前端库来构建实时Web应用。WebSocket提供了一...

    构建实时Web应用:基于HTML5 WebSocket、PHP和jQuery(对应英文版)

    基于HTML5 WebSocket、PHP和jQuery的实时Web应用开发,提供了一种高效、实时地交换数据的方式。以下是相关的知识点详解: ### 实时Web应用概念 实时Web应用指的是那些能够实时响应用户行为或数据变化的应用,这类...

    jquery拖拽上传_拖拽上传图片_jquery_

    以上代码和步骤展示了如何使用jQuery实现一个简单的图片拖拽上传功能。请注意,实际应用中可能还需要考虑错误处理、进度指示、多文件上传、文件大小限制等功能。在开发过程中,请确保遵循最佳实践,如防止XSS攻击、...

    jquery图片拖拽实例.zip

    【jQuery图片拖拽实例】是一个基于JavaScript库jQuery实现的交互式功能,允许用户通过鼠标拖动操作来移动页面上的图片。这个实例展示了如何利用jQuery的事件处理和DOM操作能力,为用户提供直观且易于使用的界面体验...

    Java Web Jquery表单验证

    实现一个基于Jquery的表单验证插件。 1、初步运用了Jquery框架进行编程,基本掌握Jquery框架的使用。 2、熟练使用Jquery-validate表单验证插件,并熟知实现原理。 3、基本实现了一个基于Jquery的表单验证的调查问卷...

    以SSH框架与jQuery技术为_省略_础的Java_Web开发应用探讨_何晶.pdf

    Spring是一个全面的企业级应用框架,提供了依赖注入和面向切面编程等功能,有助于简化Java应用程序的开发。Struts是MVC设计模式的实现,主要用于处理HTTP请求和响应,管理视图与控制器之间的交互。Hibernate是一个...

    web流程设计器(jsplumb+jqueryUI)拖拽功能

    在本文中,我们将深入探讨如何使用jsPlumb和jQuery UI库构建一个基于Web的流程设计器,该设计器具有拖拽功能,并适用于多种主流浏览器。这个工具对于业务流程建模、工作流设计以及任何需要图形化表示流程的应用场景...

    基于Jquery插件的 Web 快速开发工具

    总的来说,这款基于Jquery插件的Web快速开发工具是Visual Studio开发环境的一个强大补充,尤其适用于那些频繁使用JqueryUI和Rozor视图引擎的Web开发者。它通过自动化和标准化的代码生成,降低了开发复杂性,提升了...

    基于JQuery的拖拽布局

    【基于JQuery的拖拽布局】是一个Web开发技术主题,主要涉及如何利用JQuery库实现网页元素的拖放功能,创建动态和交互式的用户界面。在这个项目中,开发者自行编写了必要的组件,使得用户可以通过鼠标操作移动页面上...

    html5+jquery+canvas 实现调用手机拍照上传图片

    master`这个项目中,可能包含了实现上述功能的HTML、CSS和JavaScript代码,通过分析和学习这个示例,你可以深入理解如何结合HTML5、jQuery和Canvas来处理图片上传和旋转问题,这对于构建交互性强的移动Web应用非常有...

    jquery - 1.4.2 图片拖拽排序实例

    本实例主要关注的是使用jQuery 1.4.2版本实现的图片拖拽排序功能,这在创建图集、画廊或任何需要动态调整顺序的项目中非常实用。 首先,要理解拖拽排序的基本原理。拖拽排序涉及两个主要技术:事件监听和DOM操作。...

    jQuery移动Web开发(第二版).zip

    《jQuery移动Web开发(第二版)》是一本深入探讨如何使用jQuery进行移动Web应用开发的专业书籍。这本书籍的源代码包含在名为"jQuery-Mobile-Book-master"的压缩包中,为读者提供了丰富的实践示例和代码参考。jQuery,...

    jQuery支持拖拽图片上传的图片批量上传插件.zip

    jQuery作为一个广泛使用的JavaScript库,提供了丰富的API和简洁的语法,使得开发者能够更轻松地实现复杂的前端功能,比如本例中的拖拽上传和批量上传。 拖拽上传是一种现代Web应用中提升用户体验的方式,用户可以将...

    jQuery mobile + html5 + css3 开发的移动web应用

    首先,jQuery Mobile是一个轻量级的框架,专门用于构建触屏友好的网页和应用。它基于jQuery库,提供了丰富的组件、主题系统以及优化的触控事件处理,使得开发者能够快速地创建一致的跨平台界面。jQuery Mobile的核心...

    jq+layui 实现图片拖拽上传功能

    请注意,这只是一个基础的拖拽上传实现,实际应用中可能还需要处理上传到服务器、进度显示、多文件上传等更复杂的需求。在实际开发中,你可能需要结合后端接口,使用Ajax或Fetch API将图片数据发送到服务器进行存储...

    分享Jquery-UI实现Web桌面系统——jWebOS

    建议开发童鞋使用跨平台开发工具——统一开发环境UDE来进行查看、调试、开发哦~~统一开发环境是一款HTML5跨平台一站式应用开发、调试和部署工具, 它支持HTML5跨平台开发,原有Java跨平台插件支持Android、Symbian、...

    jQuery+html5拖拽上传图片预览代码.zip

    本篇文章将详细解析一个基于jQuery和HTML5的图片拖拽上传并预览的实现方案,通过分析项目中的`index.html`、`images`、`js`和`css`等文件,来深入理解这一技术的核心要点。 一、HTML5拖放API HTML5引入了拖放...

Global site tag (gtag.js) - Google Analytics