ホームページ  >  記事  >  バックエンド開発  >  jQuery+PHP+Mysqlを使ってオンラインでの写真撮影・閲覧を実現

jQuery+PHP+Mysqlを使ってオンラインでの写真撮影・閲覧を実現

巴扎黑
巴扎黑オリジナル
2017-08-15 09:22:211269ブラウズ



この記事では、Web バージョンの Ajax インタラクション テクノロジが使用されているため、例を使用して、PHP および Mysql と組み合わせて jQuery を使用して、オンライン撮影、アップロード、表示ブラウジングの機能を実現する方法を説明します。この記事の読者は、PHP と Mysql 関連の知識だけでなく、jQuery プラグインの使用法と JavaScript 関連の知識にも精通している必要があります。

この記事の例は、helloweba.com の 2 つの記事に基づいています。1 つはオンライン写真用です: Javascript + PHP によるオンライン写真機能の実装、もう 1 つは写真閲覧用です: Fancybox Rich Pop レイヤー効果。オンライン写真や Fancybox についてあまり詳しくない場合は、まず上記 2 つの記事を参照してください。

HTML

まず、アップロードされた最新の写真を表示するためのメイン ページ、index.html を作成する必要があります。最新の写真を取得するために jQuery を使用するため、これは PHP タグのない HTML ページです。写真の撮影とインタラクションのアップロードに必要な HTML 構造を含むページを作成します。

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

上記の HTML コードを本文の間に追加しました。ここで、#photos は、最新のアップロードされた写真をロードして表示するために使用されます。#camera は、カメラ フラッシュ コンポーネント Web カメラの呼び出しを含む、カメラ モジュールのロードに使用されます。写真を撮ったりアップロードしたりするためのボタンもあります。

さらに、この組み合わせ例のさまざまな操作に必要な jQuery ライブラリ、fancybox プラグイン、フラッシュ カメラ コンポーネント: webcam.js、script.js など、必要な js ファイルをindex.html にロードする必要もあります。

<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}

このようにして、インデックスをプレビューすると、次のことがわかります。 .html ページの下部にカメラ ボタンがありますが、デフォルトでは折りたたまれています。

次にしなければならないことは、jQuery を使用して実装することです。ページのすぐ下にあるカメラ ボタンをクリックして、カメラ コンポーネントを呼び出し、写真の撮影、キャンセル、アップロードに必要なアクションを完了します。

jQuery

これらの対話型アクションに必要なすべての js を script.js ファイルに書き込みます。まず、カメラ コンポーネント webcam.js をロードする必要があります。Web カメラの呼び出しについては、次の記事を参照してください: 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 -その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-パート 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()向服务器getpic.php发送get请求,并将返回的json数据进行解析,将照片信息动态插入到元素#photos下,并调用fancybox插件,然后,别忘了在页面载入后调用loadpic()。

PHP

最后,由后台getpic.php来获取数据库中的上传图片并且返回json给前端。

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);

最后,附上数据photobooth结构:

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;


以上がjQuery+PHP+Mysqlを使ってオンラインでの写真撮影・閲覧を実現の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。