CGI: Common Gateway Interface part 11
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
03/06/14 22:26ID:F9qlqHNx※CGIは特定の言語に依存するものではありません。
Perlのコーディングに関する質問は、専用スレでお願いします:
[Perl 初心者コーナー Part24]
http://pc2.2ch.net/test/read.cgi/php/1054992610/
CGIとPerlの区別がわからない、という人はとりあえずこちらへ:
[WebProg 初心者の質問 Part3]
http://pc2.2ch.net/test/read.cgi/php/1045091733/
過去ログ・関連スレッドは >>2-5 あたりに
0190nobodyさん
03/07/26 13:33ID:???別にそんなに面倒じゃないよ。
多分彼はツールの使い方を間違ってるんだよ。
もう説明するの面倒くさいからアドレス晒してくれた方が楽。
0191あぼーん
NGNG0192nobodyさん
03/08/01 14:39ID:gYU9QUBu=%3E%3E1%0D%0A%81@%81@%81@%81@+%81@%81@%81R%2
8%A5%83%D6%A5%29%2F%81@+%81@%BD%DE%BA%B0%0D%0A%81@%81@%81@%81@+%81@%81_%28.%81_+%83m
こういう文字列にブラウザが変換してWEBサーバーに送りますよね
この変換機能をつかえるモジュールや関数ってないのでしょうか
単なる2バイトの漢字コードとおもってたんですが+とかxとかの意味がよくわかりません
解説しているページがあったらお教え願います
0193あぼーん
NGNG0194nobodyさん
03/08/01 14:57ID:???0195192
03/08/01 15:18ID:???謝謝
0196あぼーん
NGNG0197あぼーん
NGNG0198あぼーん
NGNG0199192
03/08/01 18:41ID:dlG1lsZs漢字コードの変換の解説しか出ないんですけど
+ とか xがなんでててくるのかがわかりません
0200ponpon
03/08/01 19:02ID:???CGIの設定をしてあるので、Webからアクセスして、新規MLを作成すると以下のエラーがでてしまします。
WARN: cannot open /.qmail-Lnux:unet:co:jp-ka from main /usr/local/fml/makefml 3593
WARN: cannot open /.qmail-Lnux:unet:co:jp-ka-ctl from main /usr/local/fml/makefml 3594
WARN: cannot open /.qmail-Lnux:unet:co:jp-ka-default from main /usr/local/fml/makefml 3595
ちなみにコマンドでmakefml newmlの場合はエラーなく作成できました。
どなたか、わかる方教えてもらえないでしょうか?お願いします。
0201nobodyさん
03/08/01 22:33ID:???いや、書いてあるだろう……
ぐぐったんなら複数のページを参考にしてみれ。
ちなみに + は半角スペースを置換したもの。
xは特に意味はない。(そのままxという文字。おそらくシフトJISの2バイト目だろう)
0202nobodyさん
03/08/01 23:54ID:???UNIX板に全く同じ質問をしている人がいるので参考にすると良い。
http://pc.2ch.net/test/read.cgi/unix/1058708085/334
0203nobodyさん
03/08/02 00:06ID:???0205山崎 渉
03/08/02 02:21ID:???( ^^ )< ぬるぽ(^^)
0206ぼるじょあ ◆ySd1dMH5Gk
03/08/02 04:49ID:???ピュ.ー ( ・3・) ( ^^ ) <これからも僕たちを応援して下さいね(^^)。
=〔~∪ ̄ ̄ ̄∪ ̄ ̄〕
= ◎――――――◎ 山崎渉&ぼるじょあ
0207nobodyさん
03/08/02 10:28ID:fI9uzQF/すいません、UNIX板に質問しているのま私なのです。(。。)
0208nobodyさん
03/08/02 10:33ID:???0210nobodyさん
03/08/02 14:38ID:???Linux板に似たような質問をしている人がいるので参考にすると良い。
http://pc.2ch.net/test/read.cgi/linux/1059545839/217
0211nobodyさん
03/08/02 14:43ID:???放置するのはどうだろう。
だからマルチは嫌われるのだが。
0212nobodyさん
03/08/02 15:10ID:???LAN内のXPマシンにApacheを入れて、テスト環境を作りました。
以前に借りていたWebサーバーで使っていたPerlを動かしてみたところ、
open(IN, $filename)
$buff = <IN>;
とすると、テキストファイルの最後まで一気に読みこまれてしまいます。
以前の環境では改行までを読み込んでいました。
これは、どうしてなのでしょうか?
改行までを読み込むコードにするには、どうしたらいいのでしょうか。
0214nobodyさん
03/08/02 16:29ID:???また、来たよ…。>>1 も言語も書いてないオヴァカ質問者
まぁ、それは perl だから、答えると
> とすると、テキストファイルの最後まで一気に読みこまれてしまいます。
当たり前だろ。perl 知らないのか?
$buff には最初の行が入るだけで後は空読みして全部捨てられる。
スカラとかリストの事よく解ってないね
0216nobodyさん
03/08/02 17:55ID:???その通りでした。
テストで使っていたファイルだけ、たまたま[LF] になっていました。
[CRLF]の改行のファイルでやったらうまく行きました。
ありがとうございます。[LF]ではないと、思いこんでいました。
>214
さすがに、そのくらいはわかります(笑)。
0217nobodyさん
03/08/02 18:42ID:???0219nobodyさん
03/08/02 21:53ID:???>
> とすると、テキストファイルの最後まで一気に読みこまれてしまいます。
> さすがに、そのくらいはわかります(笑)。
( ´,_ゝ`)プッ
0220nobodyさん
03/08/04 13:54ID:???方法、可能かどうかについて書かれたサイト、参考書が見当たらず困っております。。
Set xmlHTTP = CreateObject("Msxml2.ServerXMLHTTP")
xmlHTTP.Open "POST", "送信先URL", False
xmlHTTP.send xmlDoc
resXML = xmlHTTP.responseXML.xml
ASPでは、上記方法でらくらくといけるのですが、
Perlで同じことをする方法ってあるのでしょうか?
0221nobodyさん
03/08/04 14:00ID:IgxIVir7ユーザから、
「あるcgiにアクセスしようとしたら、
403 のステータスコードが返された」といわれました。
でも、同じ作業を自分でやっても、再現性がとれません。(正常動作する)
これって、何が考えられるんでしょうか?
0224nobodyさん
03/08/04 16:46ID:CNOu+lh/sub form { #(1)
# いろいろなFORMに入力させsubmitさせる。
# <input type="file">もある。
}
sub reconfirm{ #(2)
# 画像込みで仮表示し内容を再確認させてsubmitさせる。
# FORMからのデータは<input type="hidden"〜>で持ち回る。
}
sub data_input{ #(3)
# ユニークなdata_idを決めてデータを格納する
# 画像データはdata_idを元にユニークなファイル名を付けてupload処理(CGI.pmで)を行う。
}
こんな流れの処理です。
※次に続く
0225224
03/08/04 16:47ID:CNOu+lh/元は受け入れデータがテキストのみで画像はなかったので、
これで上手くいっていたのですが、画像アップロード機能を付加した所
(2)を経由させると<input type="hidden"〜>では画像データを持ちまわって来ないので
とりあえず(1)→(3)として運用していますが、やはりこのままだと
ちょっとしたEnterキーの誤入力などでいきなり書き込みされてしまうので
どうしても(2)を介在させたいと思います。
(2)で再編集必要な場合、あるいは画像の選びなおしの場合に(1)に戻るのは
ブラウザの「戻る」ボタンを使わせます。
でもし画像込みで(2)の介在が可能ならば、(2)ではその画像も仮表示させたい、
と思っていますが、これを実現するには
A:(1)→(2)の段階でテンポラリーファイルにupload処理上で仮表示させ、
(3)で正式なファイル名称にrenameする。
あるいは
B:(1)→(2)では画像ファイルを変数に格納した上で仮表示し、
(3)で正式なファイル名称にした上、ディスクに格納する。
どんなふうにするのが当たり前、現実的でしょうか。
画像ファイルはJPEG又はGIFで二点ほどで、
$ENV{CONTENT_LENGTH}は200kで制限かけてます。
僕としては仮表示(正式にuploadするかどうかわからない)時点で
ディスクに書き込むよりはできれば変数に仮に格納するBにしたいのですが、
その方法がよくわかりません。
そもそも可能でしょうか。
0226224
03/08/04 16:49ID:CNOu+lh/0227nobodyさん
03/08/04 17:17ID:???Perl のみでは不可能。
削除できるんなら別にいらない機能かと思われ。
(ようするに誤送信する香具師が悪い)
あとなんでもいぃからアップローダのスクリプトを眺めて処理の流れを嫁。
0228224
03/08/04 17:44ID:CNOu+lh/ども、ありがとうございます。
そうですか、perlだけではだめですか…
アップロード処理自体は問題なくできてます。
つまりFORMで受け取ってそれをディスクに格納、はできてます。
そのあいだに再確認の手順を挟みこめないかな、と、
で、その再確認で送ろうとする画像も表示したい。
とはいえもちろんまだローカルにしかないファイルを表示はできませんから、
この時点でサーバが受け取ってなくては無理なわけですが、
できればそれをテンポラリーであれディスクに書き込まないで
できないかな、と思った次第です。
やっぱりこの機能をあきらめるか、あるいはこの時点でとりあえず仮であれ
なんであれディスクに書き込む必要がある、って事ですね。
0229nobodyさん
03/08/04 17:47ID:???メールの添付ファイルをperlを使ってbase64デコードすると、
32KBのところで切れてしまいます。
perlのソースは下記の通りです。
# ===================================================================
# mime_dec_base64 … base64デコード
# Usage : &mime_dec_base64( $input )
# 引数 : 被デコードデータ
# 戻り値 : デコード済バイナリ
# 外部参照: なし
# ===================================================================
sub mime_dec_base64 {
$_ = @_[0];
# --- 非base64キャラクターと'='を除去
tr!A-Za-z0-9+/!!cd;
# --- 底を変換する
tr!A-Za-z0-9+/!\x00-\x3f!;
# --- 6ビット揃えして、戻す
$_ = unpack('B*', $_);
s/(..)(......)/$2/g;
s/((........)*)(.*)/$1/;
$_ = pack('B*', $_);
return( $_ );
}
よろしくお願いします。
0231229
03/08/04 20:18ID:???もともとbase64エンコードって、サイズの限界が32KBなんですね。
・・・ってことで、添付ファイルを分割後エンコード→結合って方法で
解決しました。
0232224
03/08/04 20:47ID:CNOu+lh/while ( read( $fh, $buffer, $baffer_size) ) {
print "$buffer";
}
ってやったら文字化けずらずら出てきました。
なんか実現に近づいているような期待しているんですが、
勘違いですか?
0233nobodyさん
03/08/04 20:52ID:???試しにその内容を .jpg とか .gif ファイルに保存して見れば?
0234224
03/08/04 20:54ID:CNOu+lh/はい、画像ファイルです。JPEGです。
でファイルに保存したら見られます。
やりたいのはファイルに保存しないでHTMLファイルの
一部として表示しちゃいたいんです。
できませんでしょうか。
0236224
03/08/04 21:34ID:CNOu+lh/GDとか使うとメモリ内のデータを画像として表示しますよね。
その辺の応用でできないもんかな、とか思って。
いろいろやってみてるんですが上手く行かないですけど。
0237235じゃないが・・・
03/08/04 21:43ID:???>GDとか使うとメモリ内のデータを画像として表示しますよね。
htmlでの画像表示法知ってるかい
urlでファイル名を指定するんだよ。
0238nobodyさん
03/08/04 21:50ID:???0239224
03/08/04 21:54ID:CNOu+lh/はい、知ってます。
今はそれでやってますから。
FORMから受け取ったものをディスクに格納し、
表示はそのファイルを<IMG src="..."> で表示させてます。
で、FORMから受け取ったものをディスクに格納する前に、
表示する方法がないかな、といろいろやってみているわけで、
無駄な努力をしちょる、という事なんでしょうね、
きっと。
0240nobodyさん
03/08/04 22:02ID:???multipart/mixed なんてものもあるが、まともに実装されている
ブラウザが存在するのか疑問。素直に一旦ファイルに吐く方が
いいと思う。
0241nobodyさん
03/08/04 22:02ID:???>GDとか使うとメモリ内のデータを画像として表示しますよね。
表示するのは画像のみだけどね。
htmlで表示するには結局ファイルに保存しないとだめでしょ。
formで受け取ったjpeg画像もContent-type:image/jpegヘッダーの後に出力すれば
画像のみなら表示できる。
0242224
03/08/04 22:05ID:???reconfirm で一旦テンポラリーファイルに保存→表示
data_input でrenameして正式格納、って事で進めます。
ありがとうございました。
0245nobodyさん
03/08/04 23:18ID:???>画像の生データをHTMLの途中に流し込んで、って言うのが
無茶もいいところ。
GDだって「HTMLの途中に流し込」むなんてできんだろ。
というかHTMLを0から勉強した方がよさげ。
0246nobodyさん
03/08/04 23:20ID:???>というかHTMLを0から勉強した方がよさげ。
というかHTMLとHTTPを0から勉強した方がよさげ。
0247224
03/08/04 23:50ID:???画像吐き出すスクリプトを別にするなり再帰なり、何しろ別のプロセス
から吐き出して<IMG src=""〜>で呼ぶってのならできるんでしょうが、
まあ、言われなくてもいろいろ勉強中ですわ。
ほんじゃ
0248nobodyさん
03/08/05 00:56ID:???0249nobodyさん
03/08/05 01:08ID:???0250nobodyさん
03/08/05 01:18ID:???JavaScriptでローカルファイルを表示させる方法もあるのだが
教えるのは辞めておこう。
0251nobodyさん
03/08/05 01:26ID:???バイナリ埋めこんでそれを実行しようとしているようなもんだな
0252224
03/08/05 02:03ID:???GDができないんじゃなくて、HTMLをそうできないようにしてるから
できなんだと思います。
GDの出力をWEBページの一部として表示することは、
ホントにできませんか?
>>248
いえいえ、お相手ありがとうございました。
>>249
そうよばれたのは初めてです。ちゅうか、その方とは違うと思います。
>>250
いや、どうも伝わってないようですが、ローカルファイルを表示
したいわけじゃないんです。
>>251
いえ、テキストファイルじゃなくて画像ファイルって言ってるんですが、
どうも誤解させたようで、申し訳ありませんでした。
皆様に幸あれ。
0253nobodyさん
03/08/05 02:31ID:???ちゃんとレス嫁馬鹿者。
>>251が言ってる
>コイツの言っている事は、テキストファイル中に実行可能ファイルの
>バイナリ埋めこんでそれを実行しようとしているようなもんだな
は合ってるだろ。
>いえ、テキストファイルじゃなくて画像ファイルって言ってるんですが、
ほんっっっとに馬鹿だな。日本語勉強しろ。
お前はHTML(テキストファイル)の中に画像(バイナリ)を埋め込みたいと言ってる。
そりゃ実行できるわけないだろ。(まあ見えなくは無いが文字化けみたいになるわな)
ついでに
>GDができないんじゃなくて、HTMLをそうできないようにしてるから
>できなんだと思います。
どうすればHTMLにバイナリを埋め込んで表示できるんだ。
>GDの出力をWEBページの一部として表示することは、
>ホントにできませんか?
だから<img src="〜">ならできるっつってんだろ。
その時のresponse headerはContent-Type: text/htmlじゃなくてContent-Type: image/(jpeg|gif|etc.)で
message-bodyはその画像のみだ。
HTMLとHTTPを0から勉強しなおせ。
というか、人の話を聞かないようならプログラムやめろ。マジで。
0255nobodyさん
03/08/05 03:37ID:???ただ、画像サイズがデカくなると、htmlのサイズ自体も脹れ上がるからお薦めはせんし実装しようとも思わんけどな・・・
というか、GDやらしってて、この程度の発想がでてこんのが不思議であるわけだが・・・
0256nobodyさん
03/08/05 10:21ID:???0258nobodyさん
03/08/05 13:34ID:???while($a eq $b || $a eq $c || $b eq $c){
$a = int rand 10 ;
$b = int rand 10 ;
$c = int rand 10 ;
}
これでいいの?
他になんかスマートな書き方ある?
0259nobodyさん
03/08/05 13:46ID:???読み込むことってできるんですか?
0260nobodyさん
03/08/05 14:21ID:???永久ループになる可能性が 0 ではないので不可。
@seed = (0..10);
($a,$b,$c) = (splice(@seed,rand($#seed),1),splice(@seed,rand($#seed),1),splice(@seed,rand($#seed),1));
みたいにしてみる。
# ただし同じ数字が連続しない乱数は乱数ではありませんので。
>>259
できまーす。
0263nobodyさん
03/08/05 16:02ID:???「ただいま処理中です」
と表示させておいて、処理が完了したら別ページに飛ばす
(処理完了が書かれたHTMLを表示する)
というCGIを作りたいと思っているのですが、
どうもうまくいきません。。
バッファのフラッシュを考えたのですが、
最後に別ページを表示するので、ちょっと違うかなと思いました。。
こんなイメージです。
print "Content-Type:text/html\n\n";
print "loading...";
sleep(10); # ここが重い処理と想定
print "Location:$URL\n\n";
exit;
この通りではいかないのはわかっておりますが、
他に方法がないものかと思っております。。。
この処理自体、Perl-CGIではできなかったりしますかね(汗
0266263
03/08/05 17:35ID:???( ´・ω・`) ありがとう…。
HTTPヘッダの問題ということは、
言語に関わらず無理ということですね・・・。
(ASPで同様のことをやっていたのを見たことがあるのですが、
あれは何か特殊なことだったのでしょうか・・・)
0267nobodyさん
03/08/05 17:43ID:???2. バッファリングをせずに垂れ流し、処理の最後にJavaScriptのdocument.writeでHTML書き直し。
3. 2.のdocument.writeの代わりにlocationで別HTMLにジャンプ。
これぐらいしか思いつかないや
0269nobodyさん
03/08/05 17:58ID:???昔仕事でそんなようなことやってた。
そのときは、まずsubmitされたデータをhiddenなりで埋め込んだ
「ただいま処理中です」ってページを表示、
そのページのonloadでhiddenのデータをsubmitって感じでやってた。
その際、ブラウザがタイムアウトしないように改行か何かを定期的にflushして、
プログラム側(というかhttpd側?)もタイムアウトしないように
XSモジュールでスレッドとイベント作って、指定時間でraise(SIGINT)
みたいなことやってたな。<俺は関与してない
1. 入力画面
↓何らかのデータ送信
2. 送信されたデータをhiddenで埋め込んだ「処理中」ページをとりあえず表示
↓onloadで本当に処理させるページへsubmit
↓サーバで重い処理
↓定期的にタイムアウト対策
↓処理終了
3. 結果画面
って感じ。
0270nobodyさん
03/08/05 18:28ID:???0271nobodyさん
03/08/05 18:49ID:???0272263
03/08/05 20:11ID:???BODYタグのonLoad もしくは、
最後にJSでlocation.href変更スクリプトを吐き出しにしたところ、
なんとかそれっぽい感じにはなってきたんですが、
バッファリングされたりされなかったりしちゃいます。。。
#! /usr/bin/perl
$| = 1;
print "Content-Type:text/html; charset=EUC-JP\n\n";
print "<HTML><BODY>";
print "読み込み中";
print "</BODY></HTML>";
sleep(5);
print <<EOF;
<script language="javascript">
document.location.href='http://www.yahoo.co.jp/';
</script>
EOF
exit;
いくときといかないときがあるということは、
バッファリング自体怪しいかなぁ・・・
0273263
03/08/05 20:36ID:???0274263
03/08/05 20:57ID:???#! /usr/bin/perl
$| = 1;
print <<HTML_DATA;
Pragma: no-cache
Cache-Control: no-cache
Content-Type:text/html; charset=EUC-JP
<HTML>
<BODY onLoad="document.location.href='index.html';">
読み込み中
</BODY>
</HTML>
HTML_DATA
print( "\n" x 8192 );
sleep(5);
exit;
ただ、WinのNN6.2, IEでは確認とれたのですが、
Macとなると、両方ともダメでした。。。
0275nobodyさん
03/08/05 21:06ID:???0277初心者
03/08/05 22:00ID:rGA945yM質問なんですが、自分iswebで無料ホームページを作っているのですが、
cgiについてよくわかりません。
パーミッションを変更してアップロードするだけでいいのですか?
0278nobodyさん
03/08/05 22:17ID:???まずは勉強しんしゃい。
http://dir.yahoo.co.jp/Computers_and_Internet/Internet/World_Wide_Web/CGI___Common_Gateway_Interface/Guides_and_Tutorials/
0279nobodyさん
03/08/06 00:43ID:s3UpSeM9フレームは使用禁止ですか?
フレームページに隠しフレームと見えるフレームをつくる
隠しフレームのソースは重い処理をしたいCGIにする。で処理終了したら
リダイレクトするか、winodow.top.location.href = "index.html";を書き出す。
で、見えるではフレームにお待ち下さいの表示をしておく。
これで上手くできないかな??
0280279
03/08/06 00:44ID:???0281nobodyさん
03/08/06 01:03ID:pv8vzu63http://homepage3.nifty.com/coco-nut/
0282nobodyさん
03/08/06 01:12ID:9HRAagYphttp://endou.kir.jp/marimo/link.html
0284nobodyさん
03/08/06 09:23ID:???10秒も20秒もかかるの
0285263
03/08/06 10:01ID:???フレームは特に使用しても問題ないです。
その方法は結構スマートですね。
ちょっと試してみたいと思います。
>>283
フォームからCGIを呼び出して、
処理中にお待ちくださいを表示するので、
一度Locationで、hiddenを持たせたお待ちくださいHTMLを
表示して、onLoadでSubmitしてもいいかもしれません。
(この辺はブラウザ依存を要調査ですね
できれば依存を気にしなくてもできるスクリプトが望ましいです。
>>284
通信処理というより、通信経路で時間をとられるといったほうが正しいかもしれません。
みなさん色々と参考になります。
ありがとうございます。
0286263
03/08/06 10:03ID:???○重い処理というより、
でした・・・
0287263
03/08/06 13:23ID:???▼index.html
<FRAMESET rows="0,*">
<FRAME src="process.cgi" >
<FRAME src="loading.html">
</FRAMESET>
▼loading.html
<HTML>読み込み中</HTML>
▼process.cgi
print <<HTML_DATA;
<HTML>
<BODY onLoad="window.top.location.href='done.html';">読み込み中</BODY>
</HTML>
HTML_DATA
sleep(10);
exit;
▼done.html
<HTML>読み込み完了</HTML>
この場合、エラー内容を元にページを振り分けたり、
値を引き継いだりでまた問題が出そうですが・・・。
とりあえずこの方法が一番よさそうな気がします。
0288nobodyさん
03/08/06 18:52ID:???hoge.foo.co.jp
で取得することはできますか?
ただし、両者は互いに別のサーバ上にあります。
テストしてみろといわれそうですが、
今まだ環境が用意できてないもので・・・
■ このスレッドは過去ログ倉庫に格納されています