推荐:PHP+jQuery+Ajax多图片上传的实例
Ajax多图片上传效果界面
我们在页面上放置一个form表单,使用post提交到后台php处理程序upload.php,注意enctype属性设置要支持文件上传。#preview用来显示上传完毕后的图片。关于css样式设置本文不加说明,请参照下载包的源码。
代码如下 | 复制代码 |
<form id="imageform" method="post" enctype="multipart/form-data" action="upload.php"> <div id="up_status" style="display:none"><img src="loader.gif" alt="uploading"/></div> <div id="up_btn" class="btn"> <span>添加图片</span> <input id="photoimg" type="file" name="photoimg"> </div> </form> <p>最大100KB,支持jpg,gif,png格式。</p> <div id="preview"></div> |
本实例基于jQuery,因此必须在页面中载入jquery库以及jquery.wallform.js。
<script type="text/javascript" src="jquery.min.js"></script>
<script type="text/javascript" src="jquery.wallform.js"></script>
当点击按钮“添加图片”后,弹出选择文件对话框,选择要上传的图片后,触发change事件。然后表单#imageform调用jquery.wallform.js的ajaxForm()方法,将表单数据提交给后台PHP处理,并根据返回结果处理页面元素的展示。如果上传成功,图片会一张张排列显示在页面上。关于ajaxForm()的使用可以参照本站文章:Ajax表单提交插件jqery form。
代码如下 | 复制代码 |
$(function(){ $('#photoimg').die('click').live('change', function(){ var status = $("#up_status"); var btn = $("#up_btn"); $("#imageform").ajaxForm({ target: '#preview', beforeSubmit:function(){ status.show(); btn.hide(); }, success:function(){ status.hide(); btn.show(); }, error:function(){ status.hide(); btn.show(); } }).submit(); }); }); |
upload.php处理图片上传,并将上传好的图片保存在uploads/目录,注意该目录要有写权限。首先需要检测是否为POST方式提交,然后判断图片格式、图片大小是否符合要求,然后使用move_uploaded_file()上传图片,并将图片重命名,格式为:time().rand(100,999)。
代码如下 | 复制代码 |
$path = "uploads/"; $extArr = array("jpg", "png", "gif"); if(isset($_POST) and $_SERVER['REQUEST_METHOD'] == "POST"){ $name = $_FILES['photoimg']['name']; $size = $_FILES['photoimg']['size']; if(empty($name)){ echo '请选择要上传的图片'; exit; } $ext = extend($name); if(!in_array($ext,$extArr)){ echo '图片格式错误!'; exit; } if($size>(100*1024)){ echo '图片大小不能超过100KB'; exit; } $image_name = time().rand(100,999).".".$ext; $tmp = $_FILES['photoimg']['tmp_name']; if(move_uploaded_file($tmp, $path.$image_name)){ echo '<img src="'.$path.$image_name.'" class="preview">'; }else{ echo '上传出错了!'; } exit; } //获取文件类型后缀 function extend($file_name){ $extend = pathinfo($file_name); $extend = strtolower($extend["extension"]); return $extend; } |
程序主要是使用 HTTP 协议下载文件,HTTP1.1协议必须指定文档结束后关闭链接,否则读取文档时无法使用feof判断结束,可以有两种使用方法,具体请下载查看源码。
代码如下 | 复制代码 |
<?php /** * 下载远程文件类支持断点续传 */ class HttpDownload { private $m_url = ""; private $m_urlpath = ""; private $m_scheme = "http"; private $m_host = ""; private $m_port = "80"; private $m_user = ""; private $m_pass = ""; private $m_path = "/"; private $m_query = ""; private $m_fp = ""; private $m_error = ""; private $m_httphead = "" ; private $m_html = ""; /** * 初始化 */ public function PrivateInit($url){ $urls = ""; $urls = @parse_url($url); $this->m_url = $url; if(is_array($urls)) { $this->m_host = $urls["host"]; if(!empty($urls["scheme"])) $this->m_scheme = $urls["scheme"]; if(!empty($urls["user"])) $this->m_user = $urls["user"]; if(!empty($urls["pass"])) $this->m_pass = $urls["pass"]; if(!empty($urls["port"])) $this->m_port = $urls["port"]; if(!empty($urls["path"])) $this->m_path = $urls["path"]; $this->m_urlpath = $this->m_path; if(!empty($urls["query"])) { $this->m_query = $urls["query"]; $this->m_urlpath .= "?".$this->m_query; } } } /** * 打开指定网址 */ function OpenUrl($url) { #重设各参数 $this->m_url = ""; $this->m_urlpath = ""; $this->m_scheme = "http"; $this->m_host = ""; $this->m_port = "80"; $this->m_user = ""; $this->m_pass = ""; $this->m_path = "/"; $this->m_query = ""; $this->m_error = ""; $this->m_httphead = "" ; $this->m_html = ""; $this->Close(); #初始化系统 $this->PrivateInit($url); $this->PrivateStartSession(); } /** * 获得某操作错误的原因 */ public function printError() { echo "错误信息:".$this->m_error; echo "具体返回头:<br>"; foreach($this->m_httphead as $k=>$v) { echo "$k => $v <br>rn"; } } /** * 判别用Get方法发送的头的应答结果是否正确 */ public function IsGetOK() { if( ereg("^2",$this->GetHead("http-state")) ) { return true; } else { $this->m_error .= $this->GetHead("http-state")." - ".$this->GetHead("http-describe")."<br>"; return false; } } /** * 看看返回的网页是否是text类型 */ public function IsText() { if (ereg("^2",$this->GetHead("http-state")) && eregi("^text",$this->GetHead("content-type"))) { return true; } else { $this->m_error .= "内容为非文本类型<br>"; return false; } } /** * 判断返回的网页是否是特定的类型 */ public function IsContentType($ctype) { if (ereg("^2",$this->GetHead("http-state")) && $this->GetHead("content-type") == strtolower($ctype)) { return true; } else { $this->m_error .= "类型不对 ".$this->GetHead("content-type")."<br>"; return false; } } /** * 用 HTTP 协议下载文件 */ public function SaveToBin($savefilename) { if (!$this->IsGetOK()) return false; if (@feof($this->m_fp)) { $this->m_error = "连接已经关闭!"; return false; } $fp = fopen($savefilename,"w") or die("写入文件 $savefilename 失败!"); while (!feof($this->m_fp)) { @fwrite($fp,fgets($this->m_fp,256)); } @fclose($this->m_fp); return true; } /** * 保存网页内容为 Text 文件 */ public function SaveToText($savefilename) { if ($this->IsText()) { $this->SaveBinFile($savefilename); } else { return ""; } } /** * 用 HTTP 协议获得一个网页的内容 */ public function GetHtml() { if (!$this->IsText()) return ""; if ($this->m_html!="") return $this->m_html; if (!$this->m_fp||@feof($this->m_fp)) return ""; while(!feof($this->m_fp)) { $this->m_html .= fgets($this->m_fp,256); } @fclose($this->m_fp); return $this->m_html; } /** * 开始 HTTP 会话 */ public function PrivateStartSession() { if (!$this->PrivateOpenHost()) { $this->m_error .= "打开远程主机出错!"; return false; } if ($this->GetHead("http-edition")=="HTTP/1.1") { $httpv = "HTTP/1.1"; } else { $httpv = "HTTP/1.0"; } fputs($this->m_fp,"GET ".$this->m_urlpath." $httpvrn"); fputs($this->m_fp,"Host: ".$this->m_host."rn"); fputs($this->m_fp,"Accept: */*rn"); fputs($this->m_fp,"User-Agent: Mozilla/4.0+(compatible;+MSIE+6.0;+Windows+NT+5.2)rn"); #HTTP1.1协议必须指定文档结束后关闭链接,否则读取文档时无法使用feof判断结束 if ($httpv=="HTTP/1.1") { fputs($this->m_fp,"Connection: Closernrn"); } else { fputs($this->m_fp,"rn"); } $httpstas = fgets($this->m_fp,256); $httpstas = split(" ",$httpstas); $this->m_httphead["http-edition"] = trim($httpstas[0]); $this->m_httphead["http-state"] = trim($httpstas[1]); $this->m_httphead["http-describe"] = ""; for ($i=2;$i<count($httpstas);$i++) { $this->m_httphead["http-describe"] .= " ".trim($httpstas[$i]); } while (!feof($this->m_fp)) { $line = str_replace(""","",trim(fgets($this->m_fp,256))); if($line == "") break; if (ereg(":",$line)) { $lines = split(":",$line); $this->m_httphead[strtolower(trim($lines[0]))] = trim($lines[1]); } } } /** * 获得一个Http头的值 */ public function GetHead($headname) { $headname = strtolower($headname); if (isset($this->m_httphead[$headname])) { return $this->m_httphead[$headname]; } else { return ""; } } /** * 打开连接 */ public function PrivateOpenHost() { if ($this->m_host=="") return false; $this->m_fp = @fsockopen($this->m_host, $this->m_port, &$errno, &$errstr,10); if (!$this->m_fp){ $this->m_error = $errstr; return false; } else { return true; } } /** * 关闭连接 */ public function Close(){ @fclose($this->m_fp); } } #两种使用方法,分别如下: #打开网页 $httpdown = new HttpDownload(); $httpdown->OpenUrl("http://www.google.com.hk"); echo $httpdown->GetHtml(); $httpdown->Close(); #下载文件 $file = new HttpDownload(); # 实例化类 $file->OpenUrl("http://www.ti.com.cn/cn/lit/an/rust020/rust020.pdf"); # 远程文件地址 $file->SaveToBin("rust020.pdf"); # 保存路径及文件名 $file->Close(); # 释放资源 ?> |
1) time() 获取当前的系统时间戳
int time(void) :
返回当前的 Unix 时间戳 (返回自从 Unix 纪元(格林威治时间 1970 年 1 月 1 日 00:00:00)到当前时间的秒数。 )
自 PHP 5.1 起在 $_SERVER['REQUEST_TIME'] 中保存了发起该请求时刻的时间戳。
$_SERVER["REQUEST_TIME"] :The timestamp of the start of the request. Available since PHP 5.1.0. 一看解释就都明白了
2) $_SERVER["REQUEST_TIME"] 得到请求开始时的时间戳
实例代码:
代码如下 | 复制代码 |
<?php date_default_timezone_set('PRC'); sleep(5);//php脚本睡5秒 echo date('Y-m-d H:i:s',time());//获取当前系统时间的时间戳 echo '<hr />'; echo date('Y-m-d H:i:s',$_SERVER['REQUEST_TIME']);//得到请求此php脚本时的时间戳 ?> |
输出结果截图如下:
结论:
因为sleep(5)睡了5秒,之后用time()获取系统的时间戳,$_SERVER['REQUEST_TIME']则记录了发起此请求时刻的时间戳。所以$_SERVER['REQUEST_TIME']比用time()获取的时间戳早5秒
<?php include 'ganon.php'; $html = file_get_dom('http://www.111cn.net/'); foreach($html('div[class="focus"]') as $element) { echo $element->class, "<br>n"; } ?>
<?php include 'phpQuery/phpQuery.php'; phpQuery::newDocumentFile('http://www.111cn.net/'); $artlist = pq("article"); foreach($artlist as $title){ echo pq($title)->find('h2')->html()."<br/>"; } ?>
文档: http://simplehtmldom.sourceforge.net/manual.htm
<?php include 'simple_html_dom.php'; //使用url和file都可以创建DOM $html = file_get_html('http://www.111cn.net/'); //找到所有图片 // foreach($html->find('img') as $element) // echo $element->src . '<br>'; //找到所有链接 foreach($html->find('a') as $element) echo $element->href . '<br>'; ?>
<?php include("Snoopy.class.php"); $url = "http://www.111cn.net"; $snoopy = new Snoopy; $snoopy->fetch($url); //获取所有内容 echo $snoopy->results; //显示结果 // echo $snoopy->fetchtext ;//获取文本内容(去掉html代码) // echo $snoopy->fetchlinks($url) ;//获取链接 // $snoopy->fetchform ;//获取表单 ?>
如果编写能力ok,可以手写一个网页爬虫,实现网页抓取。网上有千篇一律的介绍此方法的文章,LZ就不赘述了。有兴趣了解的,可以百度 php 网页抓取。
七、开源爬虫软件汇总
发语言
|
软件名称
|
软件介绍
|
许可证
|
Java
|
Arachnid
|
微型爬虫框架,含有一个小型HTML解析器
|
GPL
|
crawlzilla
|
安装简易,拥有中文分词功能
|
Apache2
|
|
Ex-Crawler
|
由守护进程执行,使用数据库存储网页信息
|
GPLv3
|
|
Heritrix
|
严格遵照robots文件的排除指示和META robots标签
|
LGPL
|
|
heyDr
|
轻量级开源多线程垂直检索爬虫框架
|
GPLv3
|
|
ItSucks
|
提供swing GUI操作界面
|
不详
|
|
jcrawl
|
轻量、性能优良,可以从网页抓取各种类型的文件
|
Apache
|
|
JSpider
|
功能强大,容易扩展
|
LGPL
|
|
Leopdo
|
包括全文和分类垂直搜索,以及分词系统
|
Apache
|
|
MetaSeeker
|
网页抓取、信息提取、数据抽取工具包,操作简单
|
不详
|
|
Playfish
|
通过XML配置文件实现高度可定制性与可扩展性
|
MIT
|
|
Spiderman
|
灵活、扩展性强,微内核+插件式架构,通过简单的配置就可以完成数据抓取,无需编写一句代码
|
Apache
|
|
webmagic
|
功能覆盖整个爬虫生命周期,使用Xpath和正则表达式进行链接和内容的提取
|
Apache
|
|
Web-Harvest
|
运用XSLT、XQuery、正则表达式等技术来实现对Text或XML的操作,具有可视化的界面
|
BSD
|
|
WebSPHINX
|
由两部分组成:爬虫工作平台和WebSPHINX类包
|
Apache
|
|
YaCy
|
基于P2P的分布式Webseo/seo.html" target="_blank">搜索引擎
|
GPL
|
|
Python
|
QuickRecon
|
具有查找子域名名称、收集电子邮件地址并寻找人际关系等功能
|
GPLv3
|
PyRailgun
|
简洁、轻量、高效的网页抓取框架
|
MIT
|
|
Scrapy
|
基于Twisted的异步处理框架,文档齐全
|
BSD
|
|
C++
|
hispider
|
支持多机分布式下载, 支持网站定向下载
|
BSD
|
larbin
|
高性能的爬虫软件,只负责抓取不负责解析
|
GPL
|
|
Methabot
|
经过速度优化、可抓取WEB、FTP及本地文件系统
|
不详
|
|
Methanol
|
模块化、可定制的网页爬虫,速度快
|
不详
|
|
C#
|
NWebCrawler
|
统计信息、执行过程可视化
|
GPLv2
|
Sinawler
|
国内第一个针对微博数据的爬虫程序,功能强大
|
GPLv3
|
|
spidernet
|
以递归树为模型的多线程web爬虫程序,支持以GBK (gb2312)和utf8编码的资源,使用sqlite存储数据
|
MIT
|
|
Web Crawler
|
多线程,支持抓取PDF/DOC/EXCEL等文档来源
|
LGPL
|
|
网络矿工
|
功能丰富,毫不逊色于商业软件
|
BSD
|
|
PHP
|
OpenWebSpider
|
开源多线程网络爬虫,有许多有趣的功能
|
不详
|
PhpDig
|
适用于专业化强、层次更深的个性化搜索引擎
|
GPL
|
|
Snoopy
|
具有采集网页内容、提交表单功能
|
GPL
|
|
ThinkUp
|
采集推特、脸谱等社交网络数据的社会媒体视角引擎,可进行交互分析并将结果以可视化形式展现
|
GPL
|
|
微购
|
可采集淘宝、京东、当当等300多家电子商务数据
|
GPL
|
|
ErLang
|
Ebot
|
可伸缩的分布式网页爬虫
|
GPLv3
|
Ruby
|
Spidr
|
可将一个或多个网站、某个链接完全抓取到本地
|
MIT
|
在工作项目中有一个需求,要把数一些数据转成数组,然后再存到数库库一个字段中,个人目前知道两种方法,一种是用序列化函数serialize($arr);,还有一种是用php的json扩展自带的函数json_encode($arr);。
要把数一个数组,存到数据库的一个字段中,有两种方法,一种是用序列化函数serialize($arr);还有一种是用php的json扩展自带的函数json_encode($arr);如果json_encode对含有中文的字符进行编码时,会自动转换成unicode编码。就像这样:a:2:{s:4:”code”;s:1:”1″;s:3:”msg”;s:9:”PHP日志”;},虽然js上能正常处理,但是看起来还是不那爽,在PHP的官方网站上面找到一个函数,可以解决这个问题,也就是将数据转换json,而且中文不会被转换为unicode码。
代码如下 | 复制代码 |
<?php function php2js($a=false) { if (is_null($a)) return 'null'; if ($a === false) return 'false'; if ($a === true) return 'true'; if (is_scalar($a)) { if (is_float($a)) { // Always use "." for floats. $a = str_replace(",", ".", strval($a)); } // All scalars are converted to strings to avoid indeterminism. // PHP's "1" and 1 are equal for all PHP operators, but // JS's "1" and 1 are not. So if we pass "1" or 1 from the PHP backend, // we should get the same result in the JS frontend (string). // Character replacements for JSON. static $jsonReplaces = array(array("", "/", "n", "t", "r", "b", "f", '"'), array('\', '/', 'n', 't', 'r', 'b', 'f', '"')); return '"' . str_replace($jsonReplaces[0], $jsonReplaces[1], $a) . '"'; } $isList = true; for ($i = 0, reset($a); $i < count($a); $i++, next($a)) { if (key($a) !== $i) { $isList = false; break; } } $result = array(); if ($isList) { foreach ($a as $v) $result[] = php2js($v); return '[ ' . join(', ', $result) . ' ]'; } else { foreach ($a as $k => $v) $result[] = php2js($k).': '.php2js($v); return '{ ' . join(', ', $result) . ' }'; } } ?> |
使用方法一:
echo serialize(array(‘code’=>’1′,’msg’=>’PHP日志’));
输出:a:2:{s:4:”code”;s:1:”1″;s:3:”msg”;s:9:”PHP日志”;}
使用方法二:
echo json_encode(array(‘code’=>’1′,’msg’=>’PHP日志’));
输出:{“code”:”1″,”msg”:”PHPu65e5u5fd7″}
使用方法三:
echo php2js(array(‘code’=>’1′,’msg’=>’未知错误’));
输出:{ “code”: “1”, “msg”: “PHP日志” }
相关文章
- 这篇文章主要介绍了jquery实现加载更多"转圈圈"效果,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-11-10
使用PHP+JavaScript将HTML页面转换为图片的实例分享
这篇文章主要介绍了使用PHP+JavaScript将HTML元素转换为图片的实例分享,文后结果的截图只能体现出替换的字体,也不能说将静态页面转为图片可以加快加载,只是这种做法比较interesting XD需要的朋友可以参考下...2016-04-19- 最近接了一个项目,其中有需求要用到jquery分页控件,上网也找到了需要分页控件,各种写法各种用法,都是很复杂,最终决定自己动手写一个jquery分页控件,全当是练练手了。写的不好,还请见谅,本分页控件在chrome测试过,其他的兼容性...2015-10-30
- 这篇文章主要介绍了C#从数据库读取图片并保存的方法,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下...2021-01-16
- php如何实现抓取网页图片,相较于手动的粘贴复制,使用小程序要方便快捷多了,喜欢编程的人总会喜欢制作一些简单有用的小软件,最近就参考了网上一个php抓取图片代码,封装了一个php远程抓取图片的类,测试了一下,效果还不错分享...2015-10-30
- 今天小编在这里就来给各位Photoshop的这一款软件的使用者们来说说把古装美女图片转为细腻的工笔画效果的制作教程,各位想知道方法的使用者们,那么下面就快来跟着小编一...2016-09-14
- 这篇文章主要介绍了Python 图片转数组,二进制互转操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-09
- 有时我们在页面上需要选择数值范围,如购物时选取价格区间,购买主机时自主选取CPU,内存大小配置等,使用直观的滑块条直接选取想要的数值大小即可,无需手动输入数值,操作简单又方便。HTML首先载入jQuery库文件以及jRange相关...2015-03-15
- 下面小编就为大家带来一篇利用JS实现点击按钮后图片自动切换的简单方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2016-10-25
- 本文实例讲述了jQuery实现非常实用漂亮的select下拉菜单选择效果。分享给大家供大家参考,具体如下:先来看如下运行效果截图:在线演示地址如下:http://demo.jb51.net/js/2015/js-select-chose-style-menu-codes/具体代码如...2015-11-08
jquery左右滚动焦点图banner图片鼠标经过显示上下页按钮
jquery左右滚动焦点图banner图片鼠标经过显示上下页按钮...2013-10-13- 这篇文章主要为大家详细介绍了js实现上传图片及时预览的相关资料,具有一定的参考价值,感兴趣的朋友可以参考一下...2016-05-09
- 本文实例讲述了jquery实现的伪分页效果代码。分享给大家供大家参考,具体如下:这里介绍的jquery伪分页效果,在火狐下表现完美,IE全系列下有些问题,引入了jQuery1.7.2插件,代码里有丰富的注释,相信对学习jQuery有不小的帮助,期...2015-10-30
- 这篇文章主要为大家详细介绍了jQuery实现广告显示和隐藏动画,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-07-05
- JQuery使我们在开发Ajax应用程序的时候提高了效率,减少了许多兼容性问题,我们在Ajax项目中,遇到ajax异步获取数据出错怎么办,我们可以通过捕捉error事件来获取出错的信息。在没给大家介绍正文之前先给分享Jquery中AJAX参...2015-11-24
- 拜读一个开源框架,最想学到的就是设计的思想和实现的技巧。废话不多说,jquery这么多年了分析都写烂了,老早以前就拜读过,不过这几年都是做移动端,一直御用zepto, 最近抽出点时间把jquery又给扫一遍我也不会照本宣科的翻译...2014-05-31
- 当页面打开时我们需要执行一些操作,这个时候如果我们选择使用jquery的话,需要重写他的3中方法,自我感觉没什么区 别,看个人喜好了,第二种感觉比较简单明了: 第一种: 复制代码 代码如下: <script type="text/javas...2014-06-07
jQuery Mobile开发中日期插件Mobiscroll使用说明
这篇文章主要介绍了jQuery Mobile开发中日期插件Mobiscroll使用说明,需要的朋友可以参考下...2016-03-03jquery中常用的SET和GET$(”#msg”).html循环介绍
复制代码 代码如下: $(”#msg”).html(); //返回id为msg的元素节点的html内容。 $(”#msg”).html(”new content“); //将“new content” 作为html串写入id为msg的元素节点内容中,页面显示粗体的new content $(”...2013-10-13- Photoshop的这一款软件小编相信很多的人都已经是使用过了吧,那么今天小编在这里就给大家带来了用Photoshop软件制作枪战电影海报的教程,想知道制作步骤的玩家们,那么下面...2016-09-14