续《用最简单的例子实现jQuery图片即时上传》之多图上传实现
本用例主要含两个文件(index.html、submit_form_process.php),一个文件夹(files/)。特别的,files中含一个报错图片error.jpg,jquery库引用了外链。
1、index.html文件
功能:点击图片添加文件、添加多个文件、即时上传文件、显示上传文件反馈信息。
包含技术:
1)$.ajax
2)$.ajax 发送FormData对象
3)input multiple="multiple"上传多个文件
4)img οnclick="getElementById('inputfile').click()" 点击图片实现添加文件操作
5)input type="file" 样式:height:0;width:0;z-index: -1;隐藏添加文件按钮(Chrome下使用display:none会导致点击失效)
源码:
1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 2 <htmlxmlns="http://www.w3.org/1999/xhtml"> 3 <head> 4 <title>Easy Ajax FormData Upload Multiple Images</title> 5 <metahttp-equiv="Content-Type"content="text/html; charset=utf-8" /> 6 <metahttp-equiv="Content-Language"content="zh-CN" /> 7 <scripttype="text/javascript"src="http://files.cnblogs.com/Zjmainstay/jquery-1.6.2.min.js"></script> 8 </head> 9 <body> 10 <style> 11 #feedback{width:1200px;margin:0 auto;} 12 #feedback img{float:left;width:300px;height:300px;} 13 #ZjmainstaySignaturePicture,#addpicContainer{float:left;width:100%;} 14 #addpicContainer{margin-left:5px;} 15 #ZjmainstaySignaturePicture img{width:535px;} 16 #addpicContainer img{float:left;} 17 .loading{display:none;background:url("http://f7-preview.awardspace.com/zjmainstay.co.cc/jQueryExample/jquery_upload_image/files/ui-anim_basic_16x16.gif") no-repeat scroll 0 0 transparent;float:left;padding:8px;margin:18px 0 0 18px;} 18 </style> 19 <divid="ZjmainstaySignaturePicture"><ahref="http://www.cnblogs.com/Zjmainstay"><imgsrc="http://pic002.cnblogs.com/images/2012/383557/2012071311244097.jpg"/></a></div> 20 <divid="addpicContainer"> 21 <!--利用multiple="multiple"属性实现添加多图功能--> 22 <!--position: absolute;left: 10px;top: 5px;只针对本用例将input隐至图片底下。--> 23 <!--height:0;width:0;z-index: -1;是为了隐藏input,因为Chrome下不能使用display:none,否则无法添加文件--> 24 <!--οnclick="getElementById('inputfile').click()" 点击图片时则点击添加文件按钮--> 25 <imgonclick="getElementById('inputfile').click()"style="cursor:pointer;border: 1px solid #AABBCC;"title="点击添加图片"alt="点击添加图片"src="http://f7-preview.awardspace.com/zjmainstay.co.cc/jQueryExample/jquery_upload_image/files/addfile.jpg"> 26 <inputtype="file"multiple="multiple"id="inputfile"style="height:0;width:0;z-index: -1; position: absolute;left: 10px;top: 5px;"/> 27 <spanclass="loading"></span> 28 </div> 29 <divid="feedback"></div> <!--响应返回数据容器--> 30 <scripttype="text/javascript"> 31 $(document).ready(function(){32 //响应文件添加成功事件 33 $("#inputfile").change(function(){34 //创建FormData对象 35 vardata= newFormData();36 //为FormData对象添加数据 37 $.each($('#inputfile')[0].files,function(i, file) {38 data.append('upload_file'+i, file);39 });40 $(".loading").show();//显示加载图片 41 //发送数据 42 $.ajax({43 url:'submit_form_process.php',44 type:'POST',45 data:data,46 cache:false,47 contentType:false,//不可缺参数 48 processData:false,//不可缺参数 49 success:function(data){50 data=$(data).html();51 //第一个feedback数据直接append,其他的用before第1个( .eq(0).before() )放至最前面。 52 //data.replace(/</g,'<').replace(/>/g,'>') 转换html标签,否则图片无法显示。 53 if($("#feedback").children('img').length== 0) $("#feedback").append(data.replace(/</g,'<').replace(/>/g,'>'));54 else$("#feedback").children('img').eq(0).before(data.replace(/</g,'<').replace(/>/g,'>'));55 $(".loading").hide();//加载成功移除加载图片 56 },57 error:function(){58 alert('上传出错');59 $(".loading").hide();//加载失败移除加载图片 60 }61 });62 });63 });64 </script> 65 </body> 66 </html>
2、submit_form_process.php后台处理文件
功能:对FormData中包含的$_FILES数组做处理并上传图片文件,回传反馈信息。
包含技术:
1)FormData提交至$_FILES后的结构形式
2)iconv('utf-8','gb2312',$filename) 对文件名进行转码处理
3)preg_match("/^\.(jpg|jpeg|gif|png){1}$/i", strrchr($gb_filename, '.')) 文件类型过滤
4)move_uploaded_file()上传文件
5)echo '<textarea><img....<img....</textarea>';回传反馈信息。
源码:
1 <?php2 header('content-type:text/html charset:utf-8');3 $dir_base = "./files/"; //文件上传根目录4 //没有成功上传文件,报错并退出。 5 if(empty($_FILES)) {6 echo "<textarea><img src='{$dir_base}error.jpg'/></textarea>";7 exit(0);8 }9 10 $output = "<textarea>";11 $index = 0; //$_FILES 以文件name为数组下标,不适用foreach($_FILES as $index=>$file) 12 foreach($_FILES as $file){13 $upload_file_name = 'upload_file' . $index; //对应index.html FomData中的文件命名 14 $filename = $_FILES[$upload_file_name]['name'];15 $gb_filename = iconv('utf-8','gb2312',$filename); //名字转换成gb2312处理16 //文件不存在才上传 17 if(!file_exists($dir_base.$gb_filename)) {18 $isMoved = false; //默认上传失败 19 $MAXIMUM_FILESIZE = 1 * 1024 * 1024; //文件大小限制 1M = 1 * 1024 * 1024 B; 20 $rEFileTypes = "/^\.(jpg|jpeg|gif|png){1}$/i";21 if ($_FILES[$upload_file_name]['size'] <= $MAXIMUM_FILESIZE && 22 preg_match($rEFileTypes, strrchr($gb_filename, '.'))) {23 $isMoved = @move_uploaded_file ( $_FILES[$upload_file_name]['tmp_name'], $dir_base.$gb_filename); //上传文件 24 }25 }else{26 $isMoved = true; //已存在文件设置为上传成功 27 }28 if($isMoved){29 //输出图片文件<img>标签30 //注:在一些系统src可能需要urlencode处理,发现图片无法显示,31 // 请尝试 urlencode($gb_filename) 或 urlencode($filename),不行请查看HTML中显示的src并酌情解决。 32 $output .= "<img src='{$dir_base}{$filename}' title='{$filename}' alt='{$filename}'/>";33 }else{34 $output .= "<img src='{$dir_base}error.jpg' title='{$filename}' alt='{$filename}'/>";35 }36 37 $index++;38 }39 40 echo $output."</textarea>";41 42 //End_php
——————————————————————————————————————————————————————————————————————————————————
兼容IE实现(谢谢@园丁8899的提问)
1、index.html
1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 2 <htmlxmlns="http://www.w3.org/1999/xhtml"> 3 <head> 4 <title>Easy Ajax FormData Upload Multiple Images</title> 5 <metahttp-equiv="Content-Type"content="text/html; charset=utf-8" /> 6 <metahttp-equiv="Content-Language"content="zh-CN" /> 7 <scripttype="text/javascript"src="http://files.cnblogs.com/Zjmainstay/jquery-1.6.2.min.js"></script> 8 </head> 9 <body> 10 <style> 11 #feedback{width:1200px;margin:0 auto;} 12 #feedback img{float:left;max-width:300px;max-height:300px;} 13 #ZjmainstaySignaturePicture,#addpicContainer{float:left;width:100%;} 14 #addpicContainer{margin-left:5px;} 15 #ZjmainstaySignaturePicture img{width:535px;} 16 #addpicContainer img{float:left;} 17 .loading{display:none;background:url("files/loading.gif") no-repeat scroll 0 0 transparent;float:left;padding:8px;margin:18px 0 0 18px;} 18 </style> 19 <divid="ZjmainstaySignaturePicture"><ahref="http://www.cnblogs.com/Zjmainstay"><imgsrc="http://pic002.cnblogs.com/images/2012/383557/2012071311244097.jpg"/></a></div> 20 <divid="addpicContainer"> 21 <!--利用multiple="multiple"属性实现添加多图功能--> 22 <!--position: absolute;left: 10px;top: 5px;只针对本用例将input隐至图片底下。--> 23 <!--height:0;width:0;z-index: -1;是为了隐藏input,因为Chrome下不能使用display:none,否则无法添加文件--> 24 <!--οnclick="getElementById('inputfile').click()" 点击图片时则点击添加文件按钮--> 25 <imgonclick="getElementById('inputfile').click()"style="cursor:pointer;border: 1px solid #AABBCC;"title="点击添加图片"alt="点击添加图片"src="files/addfile.jpg"> 26 <inputtype="file"multiple="multiple"id="inputfile"style="height:0;width:0;z-index: -1; position: absolute;left: 10px;top: 5px;"/> 27 <spanclass="loading"></span> 28 </div> 29 <divid="feedback"></div> <!--响应返回数据容器--> 30 <scripttype="text/javascript"> 31 $(document).ready(function(){32 //成功回调函数抽取出来 33 varsuccessHandler= function(data){34 data=$(data).html();35 //第一个feedback数据直接append,其他的用before第1个( .eq(0).before() )放至最前面。 36 //data.replace(/</g,'<').replace(/>/g,'>') 转换html标签,否则图片无法显示。 37 if($("#feedback").children('img').length== 0) $("#feedback").append(data.replace(/</g,'<').replace(/>/g,'>'));38 else$("#feedback").children('img').eq(0).before(data.replace(/</g,'<').replace(/>/g,'>'));39 $(".loading").hide();//加载成功移除加载图片 40 }41 42 if(typeof(FormData)!= 'function'){43 varformHtml= '<iframe id="uploadIframe" name="uploadIframe" style="display:none;"></iframe>' 44 +'<form action="submit_form_process.php" method="post" target="uploadIframe" name="uploadForm" id="uploadForm" enctype="multipart/form-data">' 45 +'<input type="file" id="inputfile" name="upload_file" style="float:left;"/>' 46 +'<input type="hidden" name="isIE" value="1"/></form>';47 $("#inputfile,#addpicContainer>img").remove();48 $("#addpicContainer").append(formHtml);49 $("#uploadIframe").load(function(){50 vardata=$(window.frames['uploadIframe'].document.body).find("textarea");51 successHandler(data);52 });53 }54 55 //响应文件添加成功事件 56 $("#inputfile").change(function(){57 if(typeof(FormData)!= 'function'){58 $("#uploadForm").submit();59 }else{60 //创建FormData对象 61 vardata= newFormData();62 //为FormData对象添加数据 63 $.each($('#inputfile')[0].files,function(i, file) {64 data.append('upload_file'+i, file);65 });66 $(".loading").show();//显示加载图片 67 //发送数据 68 $.ajax({69 url:'submit_form_process.php',70 type:'POST',71 data:data,72 cache:false,73 contentType:false,//不可缺参数 74 processData:false,//不可缺参数 75 success: successHandler,76 error:function(){77 alert('上传出错');78 $(".loading").hide();//加载失败移除加载图片 79 }80 });81 }82 });83 });84 </script> 85 </body> 86 </html>
2、submit_form_process.php
1 <?php2 $dir_base = "./files/"; //文件上传根目录3 //没有成功上传文件,报错并退出。 4 if(empty($_FILES)) {5 echo "<textarea><img src='{$dir_base}error.jpg'/></textarea>";6 exit(0);7 }8 9 $output = "<textarea>";10 $index = 0; //$_FILES 以文件name为数组下标,不适用foreach($_FILES as $index=>$file) 11 foreach($_FILES as $file){12 if($_POST['isIE']) {13 $upload_file_name = 'upload_file'; //对应index.html中的文件命名(IE) 14 }else{15 $upload_file_name = 'upload_file' . $index; //对应index.html FomData中的文件命名(其他) 16 }17 $filename = $_FILES[$upload_file_name]['name'];18 $gb_filename = iconv('utf-8','gb2312',$filename); //名字转换成gb2312处理19 //文件不存在才上传 20 if(!file_exists($dir_base.$gb_filename)) {21 $isMoved = false; //默认上传失败 22 $MAXIMUM_FILESIZE = 1 * 1024 * 1024; //文件大小限制 1M = 1 * 1024 * 1024 B; 23 $rEFileTypes = "/^\.(jpg|jpeg|gif|png){1}$/i";24 if ($_FILES[$upload_file_name]['size'] <= $MAXIMUM_FILESIZE && 25 preg_match($rEFileTypes, strrchr($gb_filename, '.'))) {26 $isMoved = @move_uploaded_file ( $_FILES[$upload_file_name]['tmp_name'], $dir_base.$gb_filename); //上传文件 27 }28 }else{29 $isMoved = true; //已存在文件设置为上传成功 30 }31 if($isMoved){32 //输出图片文件<img>标签33 //注:在一些系统src可能需要urlencode处理,发现图片无法显示,34 // 请尝试 urlencode($gb_filename) 或 urlencode($filename),不行请查看HTML中显示的src并酌情解决。 35 $output .= "<img src='{$dir_base}{$filename}' title='{$filename}' alt='{$filename}'/>";36 }else{37 $output .= "<img src='{$dir_base}error.jpg' title='{$filename}' alt='{$filename}'/>";38 }39 40 $index++;41 }42 43 echo $output."</textarea>";44 45 //End_php
软件包下载:PHP jQuery多图上传实现源文件(兼容IE)
jQuery插件版本:jQuery插件版本(兼容IE)
本文结束之前特别感谢@东方翔在《用最简单的例子实现jQuery图片即时上传》中评论提及Ajax FormData对象,这才有了本文用jQuery实现多图上传的实现。
PS:该吐槽的吐槽,该评论的评论,该推荐的推荐,该踩的地方踩两脚——您的意见,是我完善的源泉。谢谢!
续《用最简单的例子实现jQuery图片即时上传》之多图上传实现相关推荐
- html中剪切图片所用插件,简单功能强大的jQuery图片剪裁插件Image Cropper
插件描述:相信很多朋友都在大型的网站,如新浪微博.QQ微博上看到过头像裁图工具,感觉很高大尚吧,今天朋友们有福了,今天就来说一说一款这么高大尚的插件cropper,cropper是一款使用简单且功能强 ...
- php裁剪插件,简单功能强大的jQuery图片剪裁插件Image Cropper 中文api
图片剪裁插件Image Cropper使用方法 引入必要的js和css核心文件 构建html,可以将图片或canvas直接包裹到一个块级元素中 初始化插件,可以使用$.fn.cropper方法来初始化 ...
- antlr4例子_ANTLR和网络:一个简单的例子
antlr4例子 网络上的ANTLR:为什么? 我开始在MS-DOS上编写我的第一个程序. 因此,我非常习惯在自己的机器上安装工具. 但是在2016年,网络无处不在,因此那里也可能需要我们的语言. 可 ...
- ANTLR和网络:一个简单的例子
网络上的ANTLR:为什么? 我开始在MS-DOS上编写我的第一个程序. 因此,我非常习惯在计算机上安装工具. 但是在2016年,网络无处不在,因此那里也可能需要我们的语言. 可能的情况: ANTLR ...
- 理解神经网络,从简单的例子开始(2)使用python建立多层神经网络
这篇文章将讲解如何使用python建立多层神经网络.在阅读这篇文章之前,建议先阅读上一篇文章:理解神经网络,从简单的例子开始.讲解的是单层的神经网络.如果你已经阅读了上一篇文章,你会发现这篇文章的代码 ...
- 理解神经网络,从简单的例子开始(1)7行python代码构建神经网络
理解神经网络,从简单的例子开始(1)7行python代码构建神经网络 前言 本文分为两个部分,第一个部分是一个简单的实例:9行Python代码搭建神经网络,这篇文章原文为:原文链接, 其中中文翻译版来 ...
- .net中的对象序列化(1): 序列化是什么, 以及一个简单的例子
1. 为什么需要序列化,什么是序列化 对于一个程序来说, 使用到的对象都是存在于内存中的.如果想保存这些对象的运行时状态, 或者需要在不同进程或者网络间传递对象,就需要序列化. 序列化就是讲运行中的对 ...
- CSharpGL(1)从最简单的例子开始使用CSharpGL
CSharpGL(1)从最简单的例子开始使用CSharpGL 2016-08-13 由于CSharpGL一直在更新,现在这个教程已经不适用最新的代码了.CSharpGL源码中包含20多个独立的Demo ...
- 一个简单的例子看java线程机制
一个简单的例子看java线程机制 作者: zyf0808 发表日期: 2006-03-26 11:20 文章属性: 原创 复制链接 import java.util.*; public class T ...
最新文章
- 五分钟看懂UML类图与类的关系详解
- uniapp定义全局变量方法
- linux php ldap扩展,php_ldap域集成模块安装-159
- Http压测工具wrk使用指南
- BigData预处理(完整步骤)
- 三星死守中国市场,强撑溢价难挽回颓势吗?
- java并行调度_java并行调度框架封装及示例
- 凸优化-Proximal GD
- HDFVIEW3.1.2下载
- 6.misc类设备与蜂鸣器驱动
- xcode 常见错误
- 使用微博自动记录俯卧撑个数
- 这三款小巧好用的APP,请务必收下
- C/C++ GBK2312转Unicode
- 在网络上共享条码打印机
- 企业中的IT需求如何管理?
- 计算机休眠密码,启用或停用Windows 10睡眠唤醒密码的方法
- Stata:VAR 中的脉冲响应分析 (IRF)
- ERP解决方案在印度尼西亚
- php libev 主动发送,libev学习笔记
热门文章
- Windows Azure Cloud Service (24) 在模拟器中运行时跳过Windows Azure Startup任务
- 微信小程序“信用卡还款”项目实践
- 磁盘管理之基本操作格式化
- 互联网企业招聘零分考生 扇了谁的耳光?
- 【DFS + Backtracking】LeetCode 79. Word Search
- Lintcode 51.上一个排列[Medium]
- 《 ATSS:Adaptive Training Sample Selection》
- 关于C# .net JavaScript跨域
- Software--IoC 依赖倒置 控制反转
- struts2配置默认Action