- 締切済み
PHP チャット 画像他
PHP初心者です。 どうかご教示お願い致します。 現在、リアルタイムなチャットを実装しようと 考えているものです。 下記のページで、サンプルがあり実行できました。 http://studio-key.com/122.html この機能に、入力した人は右に その他のユーザーは左にと、いわばライン風な 表示にしたいのと、 画像を送信する、機能をつけたしたいのですが、 どのようにするのでしょうか? 上記のサイトにそのような、サンプルはあったのですが、 同じよう実行しようとすると、 上手くいきませんでした。 当方、Perlでは画像投稿掲示版は作成できます、 下記のソースのような(一部抜粋) ソースで書いて画像投稿しておりますが my $img = $form->param('img'); my $data; while(read($img, my $tmp, 1024)){ $data .= $tmp; } my $filename = "img/" . $img; open(OUT,">","$filename"); binmode OUT; print OUT $data; close(OUT); } PHPではどのように記述するのでしょう? 上記のサイトのサンプルでどこにどのようなソースを埋め込む のでしょうか? ユーザーの右左はPerlでも実行したことはありません。 これは、Cookieで実行するものでしょうか?
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- superside0
- ベストアンサー率64% (461/711)
> ようは、 > ユーザーA→ログイン→CookieもしくはID取得 >→内容投稿時に、そのCookieもしくはIDで判断し >IF文にて、操作ということですよね? う~ん。ちょっと違いますね。 サーバーに保存するファイルは全員が共通で使うのですから その時点では、自分から他人かでclassの切り替えはしません。 内容投稿時ではなくて、 その投稿された全内容をサーバーからもらって 表示するときに、投稿の1行ごとに、その内容が自分か他人かをifで判定して classを変化させればよい、ということです。 > しかし、画像投稿がよくわかりません・・・ ... >file.phpとして保存したとこまでなのですが .. >chat.jsのほうで、操作するのでしょうか? PHPだけ単独のファイルとして存在しても どこからも呼ばれないので、意味がありません。 このチャットでいうと、HTML/chat.js/log.phpの全部で対応が必要です。 具体的には、それぞれには 画像ファイルを指定するフォームの追加 そのフォームで指定されたファイルを$.ajaxでアップロード アップロードされたファイルをサーバー上に保存して、そのURLをchat.logに記録 の仕組みを追加する必要があります。 「ajaxでファイルをアップロードする方法」をググってみるとよいでしょう。
- tracer
- ベストアンサー率41% (255/621)
既に似たような回答がありますが、サンプルはリアルタイムチャットではありませんよ。もっと言えば、JavaScriptによって10秒おきに強制的に読み込みを行っているだけなので、サーバーサイドの言語は、PHPであろうが、Perlではあろうが、「リアルタイム」という部分については一切関係がありません。10秒おきで十分であればよいのですが、リアルタイムにこだわるのであれば、サンプルをいくら読み解いてもゴールにはたどり着けないと思います。 昔ながらの方法であれば、ポーリングを行ってリアルタムチャットを実現していましたが、導入コスト的なこともあって、現在では、サーバー側のプッシュ通知を実装する例がほとんどだと思います。また、cometという高いソフトウェアを使わなくても、サーバーについて少し勉強すれば、無料で個人で余裕で実装(socket.i.oなど)できます。また、簡易なものであれば、サーバーの実装すらいらず、ブラウザの機能(javascript/WebRTC)だけでも実装できます。参考までに。
- superside0
- ベストアンサー率64% (461/711)
補足ですけど、 参考にされているチャットシステムは、 Ajax (jqueryの$.ajax とサーバーのPHPでXMLで返信)は使ってはいるものの、 ロングポーリングもCometも使っていないので 新着があってもなくても、10秒に1回のインターバルで発言画面を全て書き直しているだけの旧来のリフレッシュ型のチャットです。 つまり 誰かが発言したときでも、最大で10秒またないと こちらには反映されませんので ”リアルタイムなチャット”という訳ではありません。 また、表示履歴との差分表示も使っていないので、全部の発言内容を消してから 再作画してているので、10秒おきに”ゲップ”することになります。 それでよいのであれば、 発言者によって寄せの左右を切り替えるのは、chat.js中の $("<li></li>").html('<li style="color:'+color+'">'+name+' <div class="log">'+chat+'</div> <div class="date">'+date+'</div>').appendTo("#Log ul"); の行で <li> を作っているとこを if文で条件分けてして、このnameが cookieに記録された自分の名前か/他人かでclass名が変わるようにすれば よいかと思います。 (もちろんcssで そのclassで右寄せ、左寄せを指定して) 画像のアップロードを追加したいときは、No.1のご回答の通り、マニュアルを参考にされて move_uploaded_file()とか使ってサーバーのdata/{年月日時秒}.{アップロードしたファイル種に合わせた拡張子} にでも保存して data/log.txtには、その画像ファイルのサーバー上のURLを コメント文と一緒に<img src="~" class="必要に合わせて">で記録してしまえばよいと 思います。 ただし、アップロードしたファイルがどんどんサーバーに溜まっていくので、 定期的にファイルを掃除する仕組みが別途必要ですけど。
お礼
御回答ありがとうございます。 >cookieに記録された自分の名前か/他人かでclass名が変わるようにすれば よいかと思います。 この部分は、なんとか調べればできそうな気がします。 ようは、 ユーザーA→ログイン→CookieもしくはID取得 →内容投稿時に、そのCookieもしくはIDで判断し IF文にて、操作ということですよね? しかし、画像投稿がよくわかりません・・・ とりあえず、参考に提示くださった、URLから ソースがのっていたので file.phpとして保存したとこまでなのですが これは、 chat.jsのほうで、操作するのでしょうか?
- t_ohta
- ベストアンサー率38% (5238/13705)
ユーザーの左右はCSSで枠をどっちに寄せるか指定するだけでいいんじゃないでしょうか。 自分か他の人の発言かは、ログイン機能を付けるのであればユーザーIDで判断すればいいですし、ログインせずに書き込めるのであればセッションを使って投稿者を一意に判別するのがいいかもしれませんね。 ファイルアップロードの処理については PHP の公式マニュアルにサンプルコードがあります。 http://th1.php.net/manual/ja/features.file-upload.php
お礼
御回答ありがとうございます。 このサイトは、リアルタイムではないのですねΣ(゜Д゜) どうりで、少し反応が遅いはずですね リアルタイムのほうがいいですが、それに近ければいいのです しかし、10秒起きということはサーバー様に 負荷がかかるということですか?・・・ クライアント投稿までは、サーバーは応答せず 投稿すると、応答というほうがサーバーに 負荷がかからないですよね? これらの機能が、Comet ajax websocket socket.i.o などといったことでしょうか? まだ完全に理解できてません(`;ω;´)