使用过dedecms的朋友就会发现它可以实现图片上加图片水印也可以直接实现图片上加文本水印了,下面我来给大家介绍的是图片上加文字水印的方法,希望例子能帮助到各位。
代码如下 |
复制代码 |
/*PHP图片加文字水印类库
该类库暂时只支持文字水印,位置为右下角,颜色随机
调用方法:
1、在需要加水印的文件顶部引入类库:
include_once 'imageClass.php';
2、声明新类:
$tpl=new image_fu;
3、给图片水印提供参数:
$tpl->img(图片路径,水印文字,字体路径,字体大小,字体角度);
比如:$tpl->img('abc.jpg','这是水印文字','ziti.ttf',30,0)
*/
代码如下:
watermark.php
<?php
class image_fu{
private $image;
private $img_info;
private $img_width;
private $img_height;
private $img_im;
private $img_text;
private $img_ttf='';
private $img_new;
private $img_text_size;
private $img_jd;
function img($img='',$txt='',$ttf='',$size=12,$jiaodu=0){
if(isset($img)&&file_exists($img)){//检测图片是否存在
$this->image =$img;
$this->img_text=$txt;
$this->img_text_size=$size;
$this->img_jd=$jiaodu;
if(file_exists($ttf)){
$this->img_ttf=$ttf;
}else{
exit('字体文件:'.$ttf.'不存在!');
}
$this->imgyesno();
}else{
exit('图片文件:'.$img.'不存在');
}
}
private function imgyesno(){
$this->img_info =getimagesize($this->image);
$this->img_width =$this->img_info[0];//图片宽
$this->img_height=$this->img_info[1];//图片高
//检测图片类型
switch($this->img_info[2]){
case 1:$this->img_im = imagecreatefromgif($this->image);break;
case 2:$this->img_im = imagecreatefromjpeg($this->image);break;
case 3:$this->img_im = imagecreatefrompng($this->image);break;
default:exit('图片格式不支持水印');
}
$this->img_text();
}
private function img_text(){
imagealphablending($this->img_im,true);
//设定颜色
$color=imagecolorallocate($this->img_im,rand(0,255),rand(0,255),rand(0,255));
$txt_height=$this->img_text_size;
$txt_jiaodu=$this->img_jd;
$ttf_im=imagettfbbox($txt_height,$txt_jiaodu,$this->img_ttf,$this->img_text);
$w = $ttf_im[2] - $ttf_im[6];
$h = $ttf_im[3] - $ttf_im[7];
//$w = $ttf_im[7];
//$h = $ttf_im[8];
unset($ttf_im);
$txt_y =$this->img_height-$h;
$txt_x =$this->img_width-$w;
//$txt_y =0;
//$txt_x =0;
$this->img_new=@imagettftext($this->img_im,$txt_height,$txt_jiaodu,$txt_x,$txt_y,$color,
$this->img_ttf,$this->img_text);
@unlink($this->image);//删除图片
switch($this->img_info[2]) {//取得背景图片的格式
case 1:imagegif($this->img_im,$this->image);break;
case 2:imagejpeg($this->img_im,$this->image);break;
case 3:imagepng($this->img_im,$this->image);break;
default: exit('水印图片失败');
}
}
//显示图片
function img_show(){echo '<img src="'.$this->image.'" border="0" alt="'.$this->img_text.'" />';}
//释放内存
private function img_nothing(){
unset($this->img_info);
imagedestroy($this->img_im);
}
}
$addwk = new image_fu();
$addwk->img('2.jpg','testwatermark','华康少女字体.ttf',33,0);
$addwk->img_show(); //调用显示图片
?>
|
下面来看一个php模仿百度spider蜘蛛爬虫程序例子了,这个代码写得比较高级了我就不分析了,大家有需要的可以进入参考一下吧。
自己用PHP写了个爬虫,基本功能已经实现
linux 环境下运行#php spider.php http://www.111cn.net
下面为测试过程图
下面为测试结果
有兴趣的可以试试
脚本缺点:
1.未对静态页面进行去重处理
2.未对页面内js操作后的结果进行处理
代码如下 |
复制代码 |
<?php
#加载页面
function curl_get($url){
$ch=curl_init();
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch,CURLOPT_HEADER,1);
$result=curl_exec($ch);
$code=curl_getinfo($ch,CURLINFO_HTTP_CODE);
if($code!='404' && $result){
return $result;
}
curl_close($ch);
}
#获取页面url链接
function get_page_urls($spider_page_result,$base_url){
$get_url_result=preg_match_all("/<[a|A].*?href=[\'\"]{0,1}([^>\'\"\ ]*).*?>/",$spider_page_result,$out);
if($get_url_result){
return $out[1];
}else{
return;
}
}
#相对路径转绝对路径
function xdtojd($base_url,$url_list){
if(is_array($url_list)){
foreach($url_list as $url_item){
if(preg_match("/^(http:\/\/|https:\/\/|javascript:)/",$url_item)){
$result_url_list[]=$url_item;
}else {
if(preg_match("/^\//",$url_item)){
$real_url = $base_url.$url_item;
}else{
$real_url = $base_url."/".$url_item;
}
#$real_url = 'http://www.sumpay.cn/'.$url_item;
$result_url_list[] = $real_url;
}
}
return $result_url_list;
}else{
return;
}
}
#删除其他站点url
function other_site_url_del($jd_url_list,$url_base){
if(is_array($jd_url_list)){
foreach($jd_url_list as $all_url){
echo $all_url;
if(strpos($all_url,$url_base)===0){
$all_url_list[]=$all_url;
}
}
return $all_url_list;
}else{
return;
}
}
#删除相同URL
function url_same_del($array_url){
if(is_array($array_url)){
$insert_url=array();
$pizza=file_get_contents("/tmp/url.txt");
if($pizza){
$pizza=explode("\r\n",$pizza);
foreach($array_url as $array_value_url){
if(!in_array($array_value_url,$pizza)){
$insert_url[]=$array_value_url;
}
}
if($insert_url){
foreach($insert_url as $key => $insert_url_value){
#这里只做了参数相同去重处理
$update_insert_url=preg_replace('/=[^&]*/','=leesec',$insert_url_value);
foreach($pizza as $pizza_value){
$update_pizza_value=preg_replace('/=[^&]*/','=leesec',$pizza_value);
if($update_insert_url==$update_pizza_value){
unset($insert_url[$key]);
continue;
}
}
}
}
}else{
$insert_url=array();
$insert_new_url=array();
$insert_url=$array_url;
foreach($insert_url as $insert_url_value){
$update_insert_url=preg_replace('/=[^&]*/','=leesec',$insert_url_value);
$insert_new_url[]=$update_insert_url;
}
$insert_new_url=array_unique($insert_new_url);
foreach($insert_new_url as $key => $insert_new_url_val){
$insert_url_bf[]=$insert_url[$key];
}
$insert_url=$insert_url_bf;
}
return $insert_url;
}else{
return;
}
}
$current_url=$argv[1];
$fp_puts = fopen("/tmp/url.txt","ab");//记录url列表
$fp_gets = fopen("/tmp/url.txt","r");//保存url列表
$url_base_url=parse_url($current_url);
if($url_base_url['scheme']==""){
$url_base="http://".$url_base_url['host'];
}else{
$url_base=$url_base_url['scheme']."://".$url_base_url['host'];
}
do{
$spider_page_result=curl_get($current_url);
#var_dump($spider_page_result);
$url_list=get_page_urls($spider_page_result,$url_base);
#var_dump($url_list);
if(!$url_list){
continue;
}
$jd_url_list=xdtojd($url_base,$url_list);
#var_dump($jd_url_list);
$result_url_arr=other_site_url_del($jd_url_list,$url_base);
var_dump($result_url_arr);
$result_url_arr=url_same_del($result_url_arr);
#var_dump($result_url_arr);
if(is_array($result_url_arr)){
$result_url_arr=array_unique($result_url_arr);
foreach($result_url_arr as $new_url) {
fputs($fp_puts,$new_url."\r\n");
}
}
}
while ($current_url = fgets($fp_gets,1024));//不断获得url
preg_match_all("/<a[^>]+href=[\"']([^\"']+)[\"'][^>]+>/",$spider_page_result,$out);
# echo a href
#var_dump($out[1]);
?>
|
头像上传功能我们用到最多的就简单的flash+php来实现上传前剪切图片然后达到我们想要的效果了,下面我来给各位整理几个基于ci整合Avatar头像上传功能,希望例子能帮助到各位。
然后在控制器中调用即可:实现方法
代码如下 |
复制代码 |
//重新设置session(防止新传头像无法显示)
$this->session->set_userdata('user_info',$user_info);
//项目决对路径
$base_path = rtrim(str_replace('\\','/', FCPATH),'/');
require APPPATH.'libraries/avatar.class.php';
$au = new avatar($base_path.'/uploads/user/'.$user_info['mid'].'/',$base_path.'/uploads/user/temp/','/uploads/user/','/faceapi/');
if(!$user_info['face']){
$uid = 'uface_'.$user_info['mid'];
}else{
$uid = $user_info['face'];
}
$this->data['urlAvatarBig'] = $user_info['face'] ? $au->getAvatarUrl($uid,'big') : (($this->user_info['sex']==0 )? static_url().'/uploads/user/dfgirl.png' : static_url().'/uploads/user/dfboy.png' );
$this->data['urlCameraFlash'] = $au->renderHtml($uid);
$this->data['uid'] = $uid;//头像标示
$this->load->view('center/member/edit_face',$this->data);
|
视图中的调用方法
代码如下 |
复制代码 |
<div style="float:left;width:455px;height:253px;overflow:hidden;margin-left:10px;"><?php echo $urlCameraFlash ?></div>
<script type="text/javascript">
function updateavatar(){
$('#userface').attr('src','/uploads/user/<?php echo $user_info['mid'].'/'.$uid?>_big.jpg?aid='+Math.random());
}
</script>
|
下面再来补充一下avatar.class.php了
代码如下 |
复制代码 |
<?php
class avatar{
public $savePath;
public $tempPath;
public $viewPath;
public $urlPath;
public $mid;
public function __construct($savePath,$tempPath,$viewPath,$urlPath,$mid){
$this->savePath=$savePath;
$this->tempPath=$tempPath;
$this->viewPath='http://'.$_SERVER['HTTP_HOST'].$viewPath;
$this->urlPath='http://'.$_SERVER['HTTP_HOST'].$urlPath;
$this->mid = $mid;
}
// 第一步:上传原始图片文件
private function uploadAvatar($uid){
// 检查上传文件的有效性
if(empty($_FILES['Filedata'])){
return -3; // No photograph be upload!
}
// 本地临时存储位置
$tmpPath = $this->tempPath."{$uid}.jpg";
// 如果临时存储的文件夹不存在,先创建它
$dir=dirname($tmpPath);
if(!file_exists($dir)){
@mkdir($dir,0777, true );
}
// 如果同名的临时文件已经存在,先删除它
if(file_exists($tmpPath)){
@unlink($tmpPath);
}
// 把上传的图片文件保存到预定位置
if ( @copy($_FILES['Filedata']['tmp_name'], $tmpPath) || @move_uploaded_file($_FILES['Filedata']['tmp_name'], $tmpPath)) {
@unlink($_FILES['Filedata']['tmp_name']);
list($width, $height, $type, $attr) = getimagesize($tmpPath);
if ( $width < 10 || $height < 10 || $width > 3000 || $height > 3000 || $type == 4 ) {
@unlink($tmpPath);
return -2; // Invalid photograph!
}
} else {
@unlink($_FILES['Filedata']['tmp_name']);
return -4; // Can not write to the data/tmp folder!
}
// 用于访问临时图片文件的 url
$tmpUrl =$this->viewPath."temp/{$uid}.jpg";
return $tmpUrl;
}
private function flashdata_decode($s) {
$r = '';
$l = strlen($s);
for($i=0; $i<$l; $i=$i+2) {
$k1 = ord($s[$i]) - 48;
$k1 -= $k1 > 9 ? 7 : 0;
$k2 = ord($s[$i+1]) - 48;
$k2 -= $k2 > 9 ? 7 : 0;
$r .= chr($k1 << 4 | $k2);
}
return $r;
}
// 第二步:上传分割后的三个图片数据流
private function rectAvatar( $uid ){
// 从 $_POST 中提取出三个图片数据流
$bigavatar = $this->flashdata_decode( $_POST['avatar1'] );
$middleavatar = $this->flashdata_decode( $_POST['avatar2'] );
if ( !$bigavatar || !$middleavatar) {
return '<root><message type="error" value="-2" /></root>';
}
//不存在目录,则创建
if(!file_exists($this->savePath)){
@mkdir($this->savePath,0777, true );
}
// 保存为图片文件
$bigavatarfile = $this->savePath."{$uid}_big.jpg";
$middleavatarfile = $this->savePath."{$uid}_middle.jpg";
$success = 1;
$fp = @fopen($bigavatarfile, 'wb');
@fwrite($fp, $bigavatar);
@fclose($fp);
$fp = @fopen($middleavatarfile, 'wb');
@fwrite($fp, $middleavatar);
@fclose($fp);
// 验证图片文件的正确性
$biginfo = @getimagesize($bigavatarfile);
$middleinfo = @getimagesize($middleavatarfile);
if ( !$biginfo || !$middleinfo || $biginfo[2] == 4 || $middleinfo[2] == 4 ) {
file_exists($bigavatarfile) && unlink($bigavatarfile);
file_exists($middleavatarfile) && unlink($middleavatarfile);
$success = 0;
}
// 删除临时存储的图片
$tmpPath = $this->tempPath."{$uid}.jpg";
@unlink($tmpPath);
//临时保存头像
$con=mysql_connect('localhost','root','root');
mysql_select_db('zenyue');
mysql_query("set names utf8");
$sql="update zen_user set `face`='".$uid."' where mid='".$this->mid."'";
mysql_query($sql);
return '<?xml version="1.0" ?><root><face success="' . $success . '"/></root>';
}
// 从客户端访问头像图片的 url
public function getAvatarUrl( $uid, $size='middle' ){
$ci = &get_instance();
$user_info = $ci->session->userdata('user_info');
return $this->viewPath."{$user_info['mid']}/{$uid}_{$size}.jpg";
}
// 处理 HTTP Request
// 返回值:如果是可识别的 request,处理后返回 true;否则返回 false。
public function processRequest(){
// 从 input 参数里拆解出自定义参数
$arr = array();
parse_str( $_GET['input'], $arr );
$uid = $arr['uid'];
if ( $_GET['a'] == 'uploadavatar') {
// 第一步:上传原始图片文件
echo $this->uploadAvatar( $uid );
return true;
} else if ( $_GET['a'] == 'rectavatar') {
// 第二步:上传分割后的三个图片数据流
echo $this->rectAvatar( $uid );
return true;
}
return false;
}
// 编辑页面中包含 camera.swf 的 HTML 代码
public function renderHtml( $uid ){
// 把需要回传的自定义参数都组装在 input 里
$ci = &get_instance();
$user_info = $ci->session->userdata('user_info');
$input = urlencode("uid={$uid}&FSESSIONID=".session_id().'&mid='.$user_info['mid']);
$baseUrl = '/public/zen/js/avatar/';
$uc_api = urlencode( $this->urlPath.'avatar.php');
$urlCameraFlash = "{$baseUrl}camera.swf?m=user&inajax=1&appid=1&ucapi={$uc_api}&input={$input}&uploadSize=2048";
$urlCameraFlash = '<script src="'.$baseUrl.'common.js?B6k" type="text/javascript"></script><script type="text/javascript">document.write(AC_FL_RunContent("width","455","height","253","scale","exactfit","src","'.$urlCameraFlash.'","id","mycamera","name","mycamera","quality","high","bgcolor","#ffffff","wmode","transparent","menu","false","swLiveConnect","true","allowScriptAccess","always"));</script>';
return $urlCameraFlash;
}
}
|
表单提交是开发中常用的一些功能了,但是有时我们对于有些客户的要求一个页面能写出100个input出来,对于这种我们肯定不希望一个个填写并且一个个验证了,那么我们要如何来处理呢?
近段时间接到一个比较奇葩的需求,对方要求在企业站中加入一个类似word的表单,并供用户在线填写与提交。
仔细看了一下,该表单的字段高达一百多个,这个量级是相当可怕的。如果每个input手动去填写id和name的话,该是一个多么可怕的体力活啊。
反复思考了一下,为避免苦逼的去逐个填写input的id与name,决定用JS配合PHP的方式来解决这个表单一连串的提交工作。
表单组成部分
表单首先按照客户的要求,将需要填写的表格与选项按照word文档的原型进行布局,使其符合用户体验,如下图:
(上图只是截取表单的一小部分作为范例,实际上这个表单是无比之大的)
当表单的html布局完成之后,我们就需要开始对这些表单的input设定id与name用于表单提交了。
前言中已经说道到了input非常多,所以我们这里采用JS的方式来为input自动添加id与name。代码如下(jquery方式):
代码如下 |
复制代码 |
$(document).ready(function(){
var inputNum = 0;
$(‘input’).each(function(){
$(this).attr({name:‘val’+inputNum,id:‘val’+inputNum});
inputNum++
})})
|
通过js处理后,该页面的所有input都会自动按照自增1的方式对id和name进行添加。至此,这个表单的基本上可以正常使用了。(frome咱就不解释了,程序员都懂的。)
表单GET部分
OK,上面已经可以正常的把表单提交到PHP程序中进行处理了。当然上面的办法也适用于任何一种web程序,比如说.net,jsp,asp等等…..
下一步我们就需要对提交过来的字符串进行拆解,以获取表单内的值。关于如何获取表单的传值,本文就不做解释了。
由于表单传过来的值也是N个,所以我们也不可能一个一个的去写数组变量来获取这些值,所以这里也需要用到一些办法来处理。
好,下面我们来说正事。首先我们按照之前的js程序逻辑来思考,如何让这些数组每个自增1来实现数组的输出。
程序代码如下:
代码如下 |
复制代码 |
<?php
$num = 0; //初始化计数变量
$_REQUEST['val'.$num]; $num++; //插入到需要获取值的地方,每个需要获取传值的地方重复使用这串代码即可
?>
|
这组代码主要用在表单input与request顺序一致的情况下使用,如果不能一一对应顺序的话,则会出现混乱。因此用的时候需要慎重!
提交数据库的时候可以考虑使用foreach的方式将获取的传参处理成数组再插入数据库会比较方便。
下面本文章重点给大家介绍关于php中nusoap调用java axis2发布的webservice例子,希望此例子能帮助大家。
调用webservice
开发环境是:Eclipse3.6 (java IDE)+ JDK 1.6 + Tomcat 7.0 + Axis2 1.6 + php 5.2.14 (IDE为eclipse-php-helios-SR1-win32.zip)+ apache2.2.15,这些软件随时都在更新,请读者谷歌百度一下到官网下载。
一、在java端编写服务,并利用axis2发布成服务
本文的服务名为sayHi,里面有一个函数sayHello():
代码如下 |
复制代码 |
package Hi;
publicclass sayHi {
public String sayHello(String user,String info) {
return"Hello, My Friend "+ user + info;
}
}
|
二、编写php客户端,调用axis2发布的webservice
2.1 下载nusoap.rar,将解压出来的lib文件夹添加到工程
2.2 编写客户端php,内容如下:
代码如下 |
复制代码 |
<?php
require_once ("./lib/nusoap.php");
// 要访问的webservice路径
$NusoapWSDL="http://localhost:8080/axis2/services/sayHi?wsdl";
// 生成客户端对象
$client = new nusoap_client($NusoapWSDL);
//$client->soap_defencoding = 'UTF-8';
//$client->decode_utf8 = false;
// 设置参数(注意:PHP只能以'数组集'方式传递参数)
$param = array( 'user' => '国假不旅游 ',
'info' => ' Welcome to my home!');
// 调用远程方法 'sayHello'为服务中的方法名
//'http://Hi'为wsdl文件中targetNamespace的值
$result = $client->call('sayHello', $param,'http://Hi');
// 显示执行结果
if (!$err=$client->getError()){
echo $result;
}else{
echo $err;
}
?>
|
三、执行结果为:
Hello, My Friend 国假不旅游 Welcome to my home!
webservice乱码问题
许多使用NuSoap 调用.NET WebService或J2EE WebService的朋友可能都遇到过中文乱码问题(我用的是PHP调用NuSoap),下面介绍这一问题的出现的原因和相应的解决方法。
NuSoap调用WebService出现乱码的原因:
通常我们进行WebService开发时都是用的UTF-8编码,这时我们需要设置:
$client->soap_defencoding = ‘utf-8′;
同时,需要让xml以同样的编码方式传递:
$client->xml_encoding = ‘utf-8′;
至此应该是一切正常了才对,但是我们在输出结果的时候,却发现返回的是乱码。
NuSoap调用WebService出现乱码的解决方法:
实际上,开启了调试功能的朋友,相信会发现$client->response返回的是正确的结果,为什么$result = $client->call($action, array(‘parameters’ => $param)); 却是乱码呢?
研究过NuSoap代码后我们会发现,当xml_encoding设置为UTF-8时,NuSoap会检测decode_utf8的设置,如果为true,会执行 PHP 里面的utf8_decode函数,而NuSoap默认为true,因此,我们需要设置: