- ベストアンサー
ファイルアップロード方法とデータの受信方法について
- ファイルアップロードに関する方法と、データの受信方法について解説します。
- ファイルアップロードの際に、ファイル名と一緒にデータを取得する方法について詳しく説明します。
- とほほさんの書かれたコードを参考に、ファイルアップロードとデータの受信方法を実装する方法を解説します。
- みんなの回答 (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になるまで同様に繰り返します。
その他の回答 (2)
- damejan
- ベストアンサー率30% (58/192)
誤解を与えるかも知れませんので、$read_dataについての補足です。 >まずプログラムの頭のあたりで初期化していますよね。 これは、「とほほさんのオリジナルプログラムの頭」といいう意味です。 また、$read_lenは、私が勝手に作った変数です。
- damejan
- ベストアンサー率30% (58/192)
>受信したデータを、$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については知りません(使ったことないです)。このあたりの質問は、別の人にお願いします。 すみませんね。
お礼
回答ありがとうございます。 なんとなくは理解したような気がするんですが、意図したことを行う、というところまで 行き着きませんでした。 教えていただいたのにスイマセン。 もうちょっとがんばってみます。 ありがとうございました。
お礼
回答ありがとうございます。 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 ・参照ボタンでアップロードするファイルを選択 ・ラジオボタンで入れるフォルダを選択 ・受信したデータからフォルダを変数に読み込み、そのフォルダに入れるようにする