首頁  >  文章  >  web前端  >  基於jQuery PHP Mysql實現線上拍照和線上瀏覽照片_javascript技巧

基於jQuery PHP Mysql實現線上拍照和線上瀏覽照片_javascript技巧

PHP中文网
PHP中文网原創
2016-05-16 15:40:261253瀏覽

本文以範例講述如何使用jQuery與PHP及Mysql結合,實現WEB版線上拍照、上傳、顯示瀏覽的功能,ajax互動技術貫穿本文始末,所以本文的讀者要求具備相當熟悉jQuery及其外掛程式使用和javscript相關知識,具備PHP和Mysql相關知識。

點此下載來源碼   >下載來源碼 

  > HTML

首先,我們要建立一個主頁index.html來展示最新上傳的照片,我們使用jQuery來取得最新的照片,所以這是一個HTML頁面,不需要PHP標籤,當然還要建立一個包含用來拍照和上傳互動所需的HTML結構

<div id="main" style="width:90%"> 
 <div id="photos"></div> 
 <div id="camera"> 
 <div id="cam"></div> 
 <div id="webcam"></div> 
 <div id="buttons"> 
  <div class="button_pane" id="shoot"> 
  <a id="btn_shoot" href="" class="btn_blue">拍照</a> 
  </div> 
  <div class="button_pane hidden" id="upload"> 
  <a id="btn_cancel" href="" class="btn_blue">取消</a> <a id="btn_upload" href=""
  class="btn_green">上传</a> 
  </div> 
 </div> 
 </div> 
</div>


我們在body間加入了以上html程式碼,其中#photos用來載入展示最新上傳的照片;#camera用來載入攝影模組,包括呼叫攝影flash元件webcam,以及拍照和上傳等按鈕。

此外,我們還需要在index.html載入必須的js文件,包括jQuery庫,fancybox插件,flash攝影元件:webcam.js以及本範例組合各種操作所需的script. js。

<link rel="stylesheet" type="text/css" href="fancybox/jquery.fancybox-1.3.4.css" /> 
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/ 
jquery.min.js"></script> 
<script type="text/javascript" src="fancybox/jquery.fancybox-1.3.4.pack.js"></script> 
<script type="text/javascript" src="js/webcam.js"></script> 
<script type="text/javascript" src="js/script.js"></script>

CSS

為了能給大家呈現一個相當美觀的前端介面,我們使用了css3來實現一些陰影、圓角和透明度效果,請看:

#photos{width:80%; margin:40px auto} 
#photos:hover a{opacity:0.5} 
#photos a:hover{opacity:1} 
#camera{width:598px; height:525px; position:fixed; bottom:-466px; left:50%; margin-left:-300px; 
border:1px solid #f0f0f0; background:url(images/cam_bg.jpg) repeat-y; -moz-border-radius: 
4px 4px 0 0; -webkit-border-radius:4px 4px 0 0; border-radius:4px 4px 0 0; -moz-box-shadow: 
0 0 4px rgba(0,0,0,0.6); -webkit-box-shadow:0 0 4px rgba(0,0,0,0.6); box-shadow: 
0 0 4px rgba(0,0,0,0.6);}
#cam{width:100%; height:66px; display:block; position:absolute; top:0; left:0; background: 
url(images/cam.png) no-repeat center center; cursor:pointer}
#webcam{width:520px; height:370px; margin:66px auto 22px; line-height:360px; background:#ccc; 
color:#666; text-align:center} 
.button_pane{text-align:center;} 
.btn_blue,.btn_green{width:99px; height:38px; line-height:32px; margin:0 4px; border:none; 
display:inline-block; text-align:center; font-size:14px; color:#fff !important; 
text-shadow:1px 1px 1px #277c9b; background:url(images/buttons.png) no-repeat} 
.btn_green{background:url(images/buttons.png) no-repeat right top; 
text-shadow:1px 1px 1px #498917;} 
.hidden{display:none}

這樣你在預覽index.html時會發現在頁面的正下方有一個相機按鈕,預設是折疊的。

接下來我們要做的是,使用jQuery實作:透過點擊頁面正下方相機按鈕,呼叫相機元件,並且完成拍照、取消和上傳所需的動作。

jQuery

這一切的互動動作所需的js我們都寫在script.js檔案中。首先,我們需要載入相機元件webcam.js,關於webcam的調用,可以看下本站文章:Javascript PHP實作線上拍照功能。呼叫方法如下:

script.js-Part 1
$(function(){ 
 webcam.set_swf_url(&#39;js/webcam.swf&#39;); //载入flash摄像组件的路径 
 webcam.set_api_url(&#39;upload.php&#39;); // 上传照片的PHP后端处理文件 
 webcam.set_quality(80);  // 设置图像质量 
 webcam.set_shutter_sound(true, &#39;js/shutter.mp3&#39;); //设置拍照声音,拍照时会发出“咔嚓”声 
 var cam = $("#webcam"); 
 cam.html( 
 webcam.get_html(cam.width(), cam.height()) //在#webcam中载入摄像组件 
 );

這時,還看不到載入相機效果,因為#camera預設是折疊的,繼續在script.js中加入以下程式碼:

script.js-Part 2
var camera = $("#camera"); 
var shown = false; $(&#39;#cam&#39;).click(function(){  
if(shown){  
camera.animate({   
bottom:-466  });  
}else {  
camera.animate({  
 bottom:-5  }); 
  } 
   shown = !shown; });


當單擊頁面正下方的攝像頭按鈕時,預設折疊的攝影區會向上展開,這時如果您的機器安裝有攝像頭,則會加載攝像頭組件進行攝像了。

接下來,透過點擊「拍照」完成拍照功能,點擊「取消」則取消剛剛所拍的照片,點擊「上傳」則將所拍的照片上傳到伺服器。

script.js-Part 3
//拍照 
$("#btn_shoot").click(function(){ 
 webcam.freeze(); //冻结webcam,摄像头停止工作 
 $("#shoot").hide(); //隐藏拍照按钮 
 $("#upload").show(); //显示取消和上传按钮 
 return false; 
}); 
//取消拍照 
$(&#39;#btn_cancel&#39;).click(function(){ 
 webcam.reset(); //重置webcam,摄像头重新工作 
 $("#shoot").show(); //显示拍照按钮 
 $("#upload").hide(); //隐藏取消和上传按钮 
 return false; 
}); 
//上传照片 
$(&#39;#btn_upload&#39;).click(function(){ 
 webcam.upload(); //上传 
 webcam.reset();//重置webcam,摄像头重新工作 
 $("#shoot").show();//显示拍照按钮 
 $("#upload").hide(); //隐藏取消和上传按钮 
 return false; 
});

點選「上傳」按鈕後,所拍的照片會提交給後台PHP處理,PHP將照片進行命名和存檔入庫操作,請看PHP是如何操作上傳照片的。

PHP

upload.php所做的事情有:取得上傳的照片,命名,判斷是否合法的圖片,產生縮圖,存盤,寫入資料庫,回傳JSON訊息給前端。

$folder = &#39;uploads/&#39;; //上传照片保存路径 
$filename = date(&#39;YmdHis&#39;).rand().&#39;.jpg&#39;; //命名照片名称 
$original = $folder.$filename; 
$input = file_get_contents(&#39;php://input&#39;); 
if(md5($input) == &#39;7d4df9cc423720b7f1f3d672b89362be&#39;){ 
exit; //如果上传的是空白的照片,则终止程序 
} 
$result = file_put_contents($original, $input); 
if (!$result) { 
echo &#39;{"error":1,"message":"文件目录不可写";}&#39;; 
exit; 
} 
$info = getimagesize($original); 
if($info[&#39;mime&#39;] != &#39;image/jpeg&#39;){ //如果类型不是图片,则删除 
unlink($original); 
exit; 
} 
//生成缩略图 
$origImage = imagecreatefromjpeg($original); 
$newImage = imagecreatetruecolor(154,110); //缩略图尺寸154x110 
imagecopyresampled($newImage,$origImage,0,0,0,0,154,110,520,370); 
imagejpeg($newImage,&#39;uploads/small_&#39;.$filename); 
//写入数据库 
include_once(&#39;connect.php&#39;); 
$time = mktime(); 
$sql = "insert into photobooth (pic,uploadtime)values(&#39;$filename&#39;,&#39;$time&#39;)"; 
$res = mysql_query($sql); 
if($res){ 
//输出JSON信息 
echo &#39;{"status":1,"message":"Success!","filename":"&#39;.$filename.&#39;"}&#39;; 
}else{ 
echo &#39;{"error":1,"message":"Sorry,something goes wrong.";}&#39;; 
}

upload.php完成照片上傳後,最終會返回json格式的資料給前端相機元件webcam調用,現在我們回到script.js。

jQuery

webcam透過set_hook方法捕捉到後台php回傳訊息,onComplete表示上傳完成,onError則表示錯做出錯了。

script.js-Part 4

webcam.set_hook(&#39;onComplete&#39;, function(msg){ 
msg = $.parseJSON(msg); //解析json 
if(msg.error){ 
alert(msg.message); 
} 
else { 
var pic = &#39;<a rel="group" href="uploads/&#39;+msg.filename+&#39;"><img src="uploads/small_&#39;+ 
msg.filename+&#39;"></a>&#39;; 
$("#photos").prepend(pic); //将获取的照片信息插入到index.html的#photo里 
initFancyBox(); //调用fancybox插件 
} 
}); 
webcam.set_hook(&#39;onError&#39;,function(e){ 
cam.html(e); 
}); 
//调用fancybox 
function initFancyBox(){ 
$("a[rel=group]").fancybox({ 
&#39;transitionIn&#39; : &#39;elastic&#39;, 
&#39;transitionOut&#39; : &#39;elastic&#39;, 
&#39;cyclic&#39; : true
}); 
}

說明一下,上傳成功後,所拍的照片會透過以上js程式碼動態的插入到元素#photos裡,並且同時呼叫fancybox插件。這時,點選剛剛上傳的照片,會呈現fancybox彈出層效果。注意動態產生的元素必須透過上述程式碼中的initFancyBox()函數來調用fancybox,而不能直接透過fancybox()來調用,否則將不會有彈出層效果。

接下來,script.js還需要做一件事就是:動態載入最新的照片,展示在頁面上,我們透過jquery的.getJSON()方法來完成ajax請求。

script.js-Part 5

function loadpic(){ 
 $.getJSON("getpic.php",function(json){ 
 if(json){ 
  $.each(json,function(index,array){ //循环json数据 
  var pic = &#39;<a rel="group" href="uploads/&#39;+array[&#39;pic&#39;]+&#39;"> 
  <img src="uploads/small_&#39;+array[&#39;pic&#39;]+&#39;"></a>&#39;; 
  $("#photos").prepend(pic); 
  }); 
 } 
 initFancyBox(); //调用fancybox插件 
 }); 
}

loadpic();


loadpic();


函數loadpic()向伺服器getpic.php發送get請求,並將傳回的json資料進行解析,將照片資訊動態插入到元素#photos下,並呼叫fancybox插件,然後,別忘了在頁面載入後呼叫loadpic()。

PHP
include_once("connect.php"); //连接数据库 
//查询数据表中最新的50条记录 
$query = mysql_query("select pic from photobooth order by id desc limit 50"); 
while($row=mysql_fetch_array($query)){ 
 $arr[] = array( 
 &#39;pic&#39; => $row[&#39;pic&#39;] 
 ); 
} 
//输出json数据 
echo json_encode($arr);

CREATE TABLE `photobooth` ( 
 `id` int(11) NOT NULL auto_increment, 
 `pic` varchar(50) NOT NULL, 
 `uploadtime` int(10) NOT NULL, 
 PRIMARY KEY (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
最後,由後台getpic.php來取得資料庫中的上傳圖片並且傳回json到前端。

最後,附上資料photobooth結構:

以上就是基於jQuery PHP Mysql實現線上拍照和線上瀏覽照片_javascript技巧的內容,更多相關內容請關注PHP中文網(www.php.cn)!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn