• 締切済み

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で実行するものでしょうか?

  • PHP
  • 回答数4
  • ありがとう数2

みんなの回答

回答No.4

> ようは、 > ユーザー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)
回答No.3

既に似たような回答がありますが、サンプルはリアルタイムチャットではありませんよ。もっと言えば、JavaScriptによって10秒おきに強制的に読み込みを行っているだけなので、サーバーサイドの言語は、PHPであろうが、Perlではあろうが、「リアルタイム」という部分については一切関係がありません。10秒おきで十分であればよいのですが、リアルタイムにこだわるのであれば、サンプルをいくら読み解いてもゴールにはたどり着けないと思います。 昔ながらの方法であれば、ポーリングを行ってリアルタムチャットを実現していましたが、導入コスト的なこともあって、現在では、サーバー側のプッシュ通知を実装する例がほとんどだと思います。また、cometという高いソフトウェアを使わなくても、サーバーについて少し勉強すれば、無料で個人で余裕で実装(socket.i.oなど)できます。また、簡易なものであれば、サーバーの実装すらいらず、ブラウザの機能(javascript/WebRTC)だけでも実装できます。参考までに。

perlhogehoge
質問者

お礼

御回答ありがとうございます。 このサイトは、リアルタイムではないのですねΣ(゜Д゜) どうりで、少し反応が遅いはずですね リアルタイムのほうがいいですが、それに近ければいいのです しかし、10秒起きということはサーバー様に 負荷がかかるということですか?・・・ クライアント投稿までは、サーバーは応答せず 投稿すると、応答というほうがサーバーに 負荷がかからないですよね? これらの機能が、Comet ajax websocket socket.i.o などといったことでしょうか? まだ完全に理解できてません(`;ω;´)

回答No.2

補足ですけど、 参考にされているチャットシステムは、 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="必要に合わせて">で記録してしまえばよいと 思います。 ただし、アップロードしたファイルがどんどんサーバーに溜まっていくので、 定期的にファイルを掃除する仕組みが別途必要ですけど。

perlhogehoge
質問者

お礼

御回答ありがとうございます。 >cookieに記録された自分の名前か/他人かでclass名が変わるようにすれば よいかと思います。 この部分は、なんとか調べればできそうな気がします。 ようは、 ユーザーA→ログイン→CookieもしくはID取得 →内容投稿時に、そのCookieもしくはIDで判断し IF文にて、操作ということですよね? しかし、画像投稿がよくわかりません・・・ とりあえず、参考に提示くださった、URLから ソースがのっていたので file.phpとして保存したとこまでなのですが これは、 chat.jsのほうで、操作するのでしょうか?

  • t_ohta
  • ベストアンサー率38% (5078/13271)
回答No.1

ユーザーの左右はCSSで枠をどっちに寄せるか指定するだけでいいんじゃないでしょうか。 自分か他の人の発言かは、ログイン機能を付けるのであればユーザーIDで判断すればいいですし、ログインせずに書き込めるのであればセッションを使って投稿者を一意に判別するのがいいかもしれませんね。 ファイルアップロードの処理については PHP の公式マニュアルにサンプルコードがあります。 http://th1.php.net/manual/ja/features.file-upload.php

関連するQ&A

  • perl で 画像を取得したい

    下記perlのコードを書いたのですが、なぜか、画像を取得することができません。 メモ帳で開くと、画像データっぽい文字列はあるのですが、普通に見ることができません。 なぜでしょうか?また、どのように改良すれば取得できますか? ご存知の方教えていただけないでしょうか? 宜しくお願い致します。 $source = &GetImg('http://www.goo.ne.jp/img/logo/gootop_logo.gif'); $FileOut = "tmp.gif"; open(OUT, ">$FileOut"); print OUT $source; close (OUT); sub GetImg() { my($url) = @_; use LWP::UserAgent; my $browser = LWP::UserAgent->new; my $response = $browser->get($url,'User-Agent' => 'Mozilla/5.0 (Windows; U; Win98; en-US; rv:1.5) Gecko/20031007'); my $img_file = $response->content; return $img_file; }

    • ベストアンサー
    • Perl
  • PHP初心者です。

    xamppを使用して勉強してます。 htmlでファイルをアップロードするソースを作り、phpで <meta http-equiv="Content-Type" content="text/html"; charset="UTF-8" /> <?php $file=$_FILES['my_img']; $filePath="./user_img/".$file['name']; move_uploaded_file($file['tmp_name'],$filePath); というコードを書いて実行したところ、 Warning: move_uploaded_file(./user_img/021.jpg): failed to open stream: No such file or directory in  このphpファイルの名前 on line 〇〇行目 Warning: move_uploaded_file(): Unable to move 'C:\xampp\tmp\php6207.tmp' to './user_img/021.jpg' in このphpファイルの名前 on line 〇〇行目 とエラーになってしまいました。 なぜでしょうか?

    • 締切済み
    • PHP
  • PHPで画像をアップロード&保存したいのですが..

    初心者です. ブラウザから画像をアップロードし保存できるようにしたく, サンプルを基に以下のようなソースを書いてみたのですが, 画像の保存ができません. もし直さなければいけないところがわかる人がいらっしゃいましたら ぜひ教えてください. よろしくお願いいたします. <?php $img_name = $_FILES["img_path"]["name"]; $img_size = $_FILES["img_path"]["size"]; $img_type = $_FILES["img_path"]["type"]; $img_tmp = $_FILES["img_path"]["tmp_name"]; if($_REQUEST["up"] != ""){ if($img_tmp != "" and $img_size <= 30000){ $img_message = "名前は: $img_name <br>サイズは: $img_size <br>MIMEタイプは: $img_type <br>一時的に保存されているパスは: $img_tmp <br>"; }else{ $size_error = "サイズが大きすぎます。ファイルサイズは30キロバイト以下です。"; } } $FilePath = "./img/".src.".".GetExt($img_name); move_uploaded_file($img_temp,$FilePath); //GetExt function GetExt($FilePath){ $f = strrev($FilePath); $ext = substr($f, 0, strpos($f,".")); return strrev($ext); } ?>

    • 締切済み
    • PHP
  • 画像の複数登録についての質問です。

    画像を複数登録したいんですが500エラーが出てしまいます。 htmlから <input type="file" size="50" name="img1_1"> <input type="file" size="50" name="img1_2"> として、cgiにsubmitします。 cgi側でファイル名をデータ番号に変えて保存します。 例) aaaaa.jpg ↓ 1234.jpg ---cgi--- if ($param{'img1_1->name'} ne ""){ if ($param{'img1_1->name'} =~ /(\.gif|\.jpg|\.jpeg|\.pig|\.bmp)$/ ) { $extension = ($param{'img1_1->name'} =~ m/\.([^\.][0-9a-zA-Z]*)$/); $extension = $1; $filename1_1 = $upload_dir.$param{'data_num2'}."_1".$extension; if (open(OUT, ">$filename1_1")) { binmode(OUT); print OUT $param{'img1_1'}; close(OUT); } } } if ($param{'img1_2->name'} ne ""){ if ($param{'img1_2->name'} =~ /(\.gif|\.jpg|\.jpeg|\.pig|\.bmp)$/ ) { $extension = ($param{'img1_2->name'} =~ m/\.([^\.][0-9a-zA-Z]*)$/); $extension = $1; $filename1_2 = $upload_dir.$param{'data_num2'}."_2".$extension; if (open(OUT, ">$filename1_2")) { binmode(OUT); print OUT $param{'img1_2'}; close(OUT); } } } ------------ <input type="file" size="50" name="img1_1"> か <input type="file" size="50" name="img1_2"> のどちらか一方に画像ファイルを指定すれば大丈夫なんですが 両方画像を入れてしますと500エラーになってしまいます。 どのように修正すればいいんでしょうか?

    • ベストアンサー
    • Perl
  • php フォームで画像アップ

    phpにてフォームで画像をUPできる機能を持たせたいのですが、うまくできあがりません。 ファイルもUPされませんがその前の、 $_FILES ***; が機能していないようなのです。 (たとえば$img1をprintしても空となる) http://masago.kir.jp/php20030814.php http://masago.kir.jp/phpsc.php?s=php20030814s.php を参考に $img1 = $_FILES ['aaa']; $img1tmp = $_FILES ['aaa']['tmp_name']; $img1name = $_FILES ['aaa']['name']; $img1size = $_FILES ['aaa']['size']; $img1type = $_FILES ['aaa']['type']; とし、 <input type="file" name="aaa" ENCTYPE="multipart/form-data"> としています。 またレンタルサーバをもちいているのですが、 htaccessの中身は、 <IfModule mod_php4.c> php_value register_globals 1 ・ ・(省略) ・ php_value file_uploads 1 php_value upload_tmp_dir /○○/ </IfModule> としています。 よろしくお願いいたします。

    • 締切済み
    • PHP
  • PHP 画像の表示

    プログラミング初心者です。 PHPでブラウザに画像を表示したいのですが映らなくて 以下のソースコードは間違っているでしょうか? <?php $fileName = "img/test.jpg"; //ファイル名 if (file_exists($fileName)) { header('Content-type: image/jpeg'); header('Content-Length: '.filesize("http://localhost:8080/test.jpg")); //あった方が良い readfile("http://localhost:8080/test.jpg"); //ファイルを読み込んで標準出力に書き出し exit; } ?>

    • ベストアンサー
    • PHP
  • perlでCSV形式ファイルのアップロード

    本日、同じ質問をしたものです。 前回の問題は解決したのですが、ファイルがアップロードできないで悩んでします。 CGIのプログラムは以下のソースです。 #! c:/perl/bin/perl use CGI; # CGIヘッダーの出力 print "Content-type: text/html\n\n"; my ($query,$fileName); $query = new CGI; $fileName = $query->param('fileName'); open(OUT, ">./a.csv"); binmode(OUT); while(read($fileName,$buffer,1024)) { print OUT $buffer; } close(OUT); close($fileName); #ファイルハンドルをcloseしています。 exit ; ファイルは、作られるのですが、中身が書き込まれません。 どなたか教えてください。 お願いします。

    • ベストアンサー
    • Perl
  • kcaptchaで画像が表示されません。

    kcaptchaという画像認証を導入しようとしていますが 画像が表示されず(パスが通ってない×印がでる) 投稿させていただきます。 http://freecode.com/projects/kcaptcha 画像表示部分のソースはいかになります。 <form action="index.php" method="post"> <p>Enter text shown below:</p> <p><img src="./kcaptcha.php?<?php echo session_name()?>=<?php echo session_id()?>"></p> <p><input type="text" name="keystring"></p> <p><input type="submit" value="Check"></p> </form> このimg src="./kcaptcha.php?<?php echo session_name()?>=<?php echo session_id()?> がうまく言ってないと思うのですがどう修正したらよいかわからず 投稿させていただきました。 img src="./kcaptcha.php?←の部分はindex.phpなどいろいろ試しましたがだめでした。 何か自作のphpファイルなどを用意する必要があるのでしょうか? 以下環境になります。 サクラレンタルサーバ スタンダードプラン session.save_path /home/user/tmp /home/user/tmp session.use_cookies On On session.use_only_cookies On On session.use_trans_sid 1 1 tmpフォルダにはsessionデータらしきファイルが保存されています。 提示不足の情報などありましたらできる限り 対応したいと思います。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • はじめまして

    はじめまして 現在、PerlのMVCフレームワークCatalystのperlソースコード内で ボタンを押すと、ユーザーにとあるファイルをダウンロードさせたい と考え、以下のように実装しました my $filedir = '/var/www/html/Catal/lib/Catal/Controller/'; my $filename = 'test.zip'; my $filepath = $filedir . $filename; print "Content-type:application/download; name=\"$filename\"\n"; print "Content-Disposition: attachment; filename=\"hogehoge\"\n\n"; open(FILE,"< $filepath"); binmode FILE; binmode STDOUT; print while(<FILE>); close(FILE); 上記コードを動かすとIEのページにZIPファイルがバイナリ表示されるだけで ダウンロードダイアログすら出ません。 どうしたら、ダイアログを表示させ、ユーザーが望む場所にダウンロード させることができるでしょうか。 よろしくお願いします。

  • 画像投稿がない場合、特定画像を表示させたい

    画像投稿型BBSを改造しています。 画像を投稿すると、画像名をlinux時間に変換し、1296913178.jpgとして保管します。 一方、CSVファイルにも1296913178.jpgという名を記載します。 【困りごと】 画像投稿が前提とされているため、画像投稿がなかった場合CSVファイルへの記載 が空欄となるため<img src="./data/> となってしまい見た目がよくありません。 【改造したいこと。】 デフォルトで j.jpg という画像を置き、新規投稿時に、画像名がある場合は <img src="./data/j.jpg1296913178.jpg> となり、 画像がない時は、<img src="./data/j.jpg> となるように改造したいと考えています。 【今までに出来たこと】 下記のソースの一番下をj.jpg$attachに変更することにより、CSVファイルへの書き込み については j.jpg1296913178.jpg というものを作ることができました。 【出来ないこと(真の困りごと】 画像名をlinux時間に変換し、1296913178.jpgとして保管していますが、 これをj.jpg1296913178.jpgとして保管するようにすることができません。下記をテスト しましたが駄目でした。 if (!$original || !$filename) $filename = j.jpg$now.".".$ext; if (!$original || !$filename) $filename = j.jpg+$now.".".$ext; .htaccessでも結構です。対応アドバイスをお願いします。 【ソース】 // ファイル名を抽出 if (eregi("name=\"?([^\"\n]+)\"?",$m_head, $filereg)) { $filename = ereg_replace("[\t\r\n]", "", $filereg[1]); while (eregi("(.*)=\?iso-2022-jp\?B\?([^\?]+)\?=(.*)",$filename,$regs)) { $filename = $regs[1].base64_decode($regs[2]).$regs[3]; $filename = convert($filename); } $ext = substr($filename,strrpos($filename,".")+1,strlen($filename)-strrpos($filename,".")); } // 添付データをデコードして保存 if (eregi("\nContent-Transfer-Encoding:.*base64", $m_head) && eregi($subtype, $sub)) { $tmp = base64_decode($m_body); if (!$ext) $ext = $sub; if (!$original || !$filename) $filename = j.jpg+$now.".".$ext; if (strlen($tmp) < $maxbyte && !eregi($viri, $filename) && $write) { $fp = fopen($tmpdir.$filename, "w"); fputs($fp, $tmp); fclose($fp); $attach = $filename; } else { $write = false; } } } if ($imgonly && $attach=="") $write = false; list($old,$otime,$osubj,$ofrom,,) = explode("<>", $lines[0]); // 連続投稿 if ($from == $ofrom && $now - $otime < $wtime) $write = false; $id = $old + 1; $subject = trim if($subject=="") $subject = $nosubject; $line = "$id<>$now<>$subject<>$from<>$text<>j.jpg$attach<>\n

    • ベストアンサー
    • CGI

専門家に質問してみよう