![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
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;
}
としているみたいです。
ファイルをアップロードするだけなら上記をそのまま使用すればいいのですが、
ファイル名とともに取得したいデータをファイルアップロードの画面でユーザーに指定してもらうので、
そのデータをどのように取得すればいいのかわかりません。
このとほほさんが書いたコードはどのようにデータを受信しているのでしょうか?
おわかりの方ご説明お願いします。
No.1ベストアンサー
- 回答日時:
質問の内容は、
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になるまで同様に繰り返します。
回答ありがとうございます。
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
・参照ボタンでアップロードするファイルを選択
・ラジオボタンで入れるフォルダを選択
・受信したデータからフォルダを変数に読み込み、そのフォルダに入れるようにする
No.3
- 回答日時:
誤解を与えるかも知れませんので、$read_dataについての補足です。
>まずプログラムの頭のあたりで初期化していますよね。
これは、「とほほさんのオリジナルプログラムの頭」といいう意味です。
また、$read_lenは、私が勝手に作った変数です。
No.2
- 回答日時:
>受信したデータを、$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については知りません(使ったことないです)。このあたりの質問は、別の人にお願いします。
すみませんね。
回答ありがとうございます。
なんとなくは理解したような気がするんですが、意図したことを行う、というところまで
行き着きませんでした。
教えていただいたのにスイマセン。
もうちょっとがんばってみます。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- CGI htmlからパラメータで、cgiに渡したい。 1 2023/02/06 16:15
- その他(プログラミング・Web制作) python 気象データの取得 2 2023/06/20 23:54
- その他(プログラミング・Web制作) pythonでクラスで複数のメソッドを利用する方法 2 2022/04/15 04:17
- PHP 画像ファイルの名前をそのままURLにする 3 2022/10/16 11:18
- Visual Basic(VBA) Excel-VBAでのファイルの開き方 4 2023/02/14 11:01
- Java 動かなくなったのでJavaソースを手直しお願いします。 2 2022/04/30 05:35
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- その他(プログラミング・Web制作) Fortranでの出力ファイル 2 2023/03/21 21:25
- C言語・C++・C# c言語の問題です 2 2023/07/21 10:51
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ポインター引数の関数でコンパ...
-
printfの%eで指数部分の桁数を...
-
stable diffusionのエラー
-
C言語 ファイル内のデータと入...
-
int型(2バイト)データの分割
-
C#でのswitch文
-
テキストファイルの結合について
-
Cのプログラムがどうしても動き...
-
'dataType' 引数を Null にする...
-
C言語の構造体にてバブルソート...
-
c言語 配列から数字だけをint型...
-
二次元配列
-
c言語での wavファイルの編集(...
-
C言語 2分木探索について質問です
-
【Excel VBA】10進数を2進数に...
-
10個の実数に対する降順ソート...
-
マクロ登録したピボットが重い...
-
char str[256]の256の意味は?
-
エクセルシート名の制限を変更...
-
COBOLのCOMP形式について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ポインター引数の関数でコンパ...
-
stable diffusionのエラー
-
printfの%eで指数部分の桁数を...
-
エクセルVBA:日付データの変換...
-
linuxのシェルでファイル名に先...
-
int型(2バイト)データの分割
-
【Excel VBA】10進数を2進数に...
-
C#でのswitch文
-
データの値の近いものをグルー...
-
C言語 ファイル内のデータと入...
-
10個の実数に対する降順ソート...
-
C言語の構造体にてバブルソート...
-
'dataType' 引数を Null にする...
-
matlabのソースコードをpython...
-
C言語の勉強しています。すみま...
-
c言語での wavファイルの編集(...
-
テキストファイルの結合について
-
C言語についてです! 同じ年の...
-
sort関数でひらがなとカタカナ...
-
matlabでのRRI検出
おすすめ情報