最速怪談選手権

http://tohoho.wakusei.ne.jp/wwwxx034.htm

のファイルのアップローダーを使用しています。
私は普段postのデータを受け取るのに、
read(STDIN,$buffer,$ENV{'content_length'});
のように指定していますが、ここでは

$buf = "";
$read_data = "";
$remain = $ENV{'CONTENT_LENGTH'};
binmode(STDIN);
while ($remain) {
$remain -= sysread(STDIN, $buf, $remain);
$read_data .= $buf;
}

としているみたいです。

ファイルをアップロードするだけなら上記をそのまま使用すればいいのですが、
ファイル名とともに取得したいデータをファイルアップロードの画面でユーザーに指定してもらうので、
そのデータをどのように取得すればいいのかわかりません。

このとほほさんが書いたコードはどのようにデータを受信しているのでしょうか?

おわかりの方ご説明お願いします。

A 回答 (3件)

質問の内容は、


while ($remain) {
$remain -= sysread(STDIN, $buf, $remain);
$read_data .= $buf;
}
この部分の内容を解説してくださいということでしょうか?

ちなみに、分かりやすく書き換えるとこんな感じです。
while($remain) {
$read_len = sysread(STDIN, $buf, $remain);
$read_data = $read_data.$buf;
$remain = $remain - $read_len;
}

whileループを回しているのは、sysreadは必ずしも$remain分だけのデータを読み込むことを保証していないからです(これはエラーではありません)。読み残しを防ぐためです。もし、読み残しがあれば、読み残しの長さを新たに$remainにセットし、再度sysreadします。あとは読み残しが0になるまで同様に繰り返します。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

while($remain) {
$read_len = sysread(STDIN, $buf, $remain);
$read_data = $read_data.$buf;
$remain = $remain - $read_len;
}

受信したデータを、
$read_lenに代入
($read_len = sysread(STDIN, $buf, $remain); は
$read_len = sysread(SITDIN,$buf,$ENV{'CONTENT_LENGTH'});ってことですよね?)
$read_dataはどこから出てきたのでしょうか?


それと下記のようにしたいのですが、どのようにしたらいいでしょうか?
よろしくお願いします。


┌───┐ ┌──┐
│    │ │参照│
└───┘ └──┘
 ○ フォルダ1 ○フォルダ2

・参照ボタンでアップロードするファイルを選択
・ラジオボタンで入れるフォルダを選択
・受信したデータからフォルダを変数に読み込み、そのフォルダに入れるようにする

お礼日時:2003/05/20 09:08

誤解を与えるかも知れませんので、$read_dataについての補足です。



>まずプログラムの頭のあたりで初期化していますよね。

これは、「とほほさんのオリジナルプログラムの頭」といいう意味です。
また、$read_lenは、私が勝手に作った変数です。
    • good
    • 0

>受信したデータを、$read_lenに代入



違います。
$read_len = sysread(STDIN, $buf, $remain);
では、$bufに読み込んだデータが、$read_lenに読み込んだデータ長がそれぞれ代入されます。

「$remain分だけデータを読み込んでんじゃないの?」と疑問をお持ちかも知れませんが、この関数は、最大で$remain分のデータを$bufに読み込めと命令しえいるだけで、必ずしも$remain分を読み込むとは限らないのです(データの遅延などのため)。

>$read_dataはどこから出てきたのでしょうか?

まずプログラムの頭のあたりで初期化していますよね。
$read_data = $read_data.$buf;
では、$buf(sysreadで読み込んだデータが入っている)の内容を$read_dataにどんどん継ぎ足していっています。(「.」演算子は文字列を連結します)

>それと下記のようにしたいのですが、どのようにしたらいいでしょうか?

私はperlプログラミングをちょっとかじっているだけで、CGIやhtmlについては知りません(使ったことないです)。このあたりの質問は、別の人にお願いします。
すみませんね。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
なんとなくは理解したような気がするんですが、意図したことを行う、というところまで
行き着きませんでした。
教えていただいたのにスイマセン。
もうちょっとがんばってみます。

ありがとうございました。

お礼日時:2003/05/21 10:54

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!