-PR-
解決
済み

ReadParseを使ってのバイナリファイルのアップロード

  • 暇なときにでも
  • 質問No.13068
  • 閲覧数287
  • ありがとう数7
  • 気になる数0
  • 回答数4
  • コメント数0

お礼率 29% (20/68)

ファイルをアップロードするCGIを作ろうと思い、以下のように書いてみました。そうしたところテキストファイルのアップロードには成功しましたが、バイナリファイルだとアップロード出来ても開けなかったり、画像が崩れてしまったりしてしまいました。

何故バイナリファイルだとアップロードが失敗してしまうのかわかりません。どこを直せば良いのでしょうか。
よろしくお願いします。

-----------------------------------------------
フォーム

<FORM METHOD="POST" ENCTYPE="multipart/form-data" ACTION="xxx.pl">
<INPUT TYPE="file" NAME="file">
<INPUT TYPE="submit" VALUE="アップロード">
</FORM>

------------------------------------------------
xxx.pl

&ReadParse(*in, *f_name, *f_type);
$f_name{'file'}=~/([^\\\/]+)$/;
$filename = $1;
open(IN, ">$filename");
print IN $in{'file'};
close(IN);
通報する
  • 回答数4
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

質問者が選んだベストアンサー

  • 回答No.4

 補足見ました。

 根本的に説明が間違ってましたねー(^_^;
 えとですね。
 print文はバイナリファイルには使えません。
 syswrite関数を使います。

 詳細は下記参照のこと。
お礼コメント
ryogoku

お礼率 29% (20/68)

何度もありがとうございました!行ってみます!
投稿日時 - 0000-00-00 00:00:00
-PR-
-PR-

その他の回答 (全3件)

  • 回答No.1
レベル7

ベストアンサー率 29% (7/24)

テキストファイルは、ASCIIでそのまま送れるのに対して、バイナリファイルは、バイナリだ、ということを認識させないとだめだと思うのです。 ですから、ファイルのタイプによって、転送時のモードを変更するようにしてやればいいと思うのですが。perlはよくわからないのですが、多分そういうことだと思います。 ...続きを読む
テキストファイルは、ASCIIでそのまま送れるのに対して、バイナリファイルは、バイナリだ、ということを認識させないとだめだと思うのです。

ですから、ファイルのタイプによって、転送時のモードを変更するようにしてやればいいと思うのですが。perlはよくわからないのですが、多分そういうことだと思います。
お礼コメント
ryogoku

お礼率 29% (20/68)

回答ありがとうございました!
投稿日時 - 0000-00-00 00:00:00


  • 回答No.2

 これ、ReadParseの中でなにやってるんでしょうか? Perlの標準関数じゃないですよね。  もしこれが cgi-lib.pl で定義された関数なのであれば、使い方が違いますよ。 ...続きを読む
 これ、ReadParseの中でなにやってるんでしょうか? Perlの標準関数じゃないですよね。
 もしこれが cgi-lib.pl で定義された関数なのであれば、使い方が違いますよ。
補足コメント
ryogoku

お礼率 29% (20/68)

cgi-libの中のReadParse関数を使用しています。v 2.18をコメントを読みながら使用しているのですが、学生時代英語の成績が悪かったので使い方には全く自信ないです。正しい使い方や、簡単に説明して下さるページ等教えて下さい!
プログラムを見ると、バイナリの中に\r\nが含まれている場合に失敗するのではないかと思っているのですが…。
投稿日時 - 2000-11-16 08:15:38
  • 回答No.3

 補足見ました。  まず、cgi-lib.pl の &ReadParse関数に引数は必要ありません。  値はすべて %in という連想配列関数の中に格納されます。  たとえば、 <input type="text" name="A" value="123"> <input type="text" ...続きを読む
 補足見ました。

 まず、cgi-lib.pl の &ReadParse関数に引数は必要ありません。
 値はすべて %in という連想配列関数の中に格納されます。

 たとえば、

<input type="text" name="A" value="123">
<input type="text" name="B" value="456">
<input type="file" name="C">

 というフォームを作ってそれをCGIに渡した場合、&ReadParse実行後の %in の中身は、

 $in{'A'} = "123"
 $in{'B'} = "456"
 $in{'C'} = ...

 となります。
 上記中の...の部分は不定のファイル名です。
 このとき、

 open(IN, "<$in{'C'}");

 を実行すると、ファイルディスクリプタINに、フォームで渡したファイルが割り当てられますので、

 $value = <IN>;

 もしくは、

 @file = <IN>;

 で中身を読み込みます。

 以上です。

 他に分からないことがあったら別途補足を下さい。
補足コメント
ryogoku

お礼率 29% (20/68)

私が何をしたいかというと、ファイルをそのファイル名のまま保存したいということです。ReadParseでファイルを送る場合、引数を指定しないと、第1引数(この場合はファイルの中身)のみが出されますよね。今回はファイル名も欲しいので第2引数f_nameも指定しました。(cgi-libでは*incfnになっていました。名前を変えてしまってすいません。)それで、
------------------
↓ここでファイル名を処理をして
$f_name{'file'}=~/([^\\\/]+)$/;
$filename = $1;
------------------
↓ここからそのファイル名で新規ファイルをオープン・保存してみました。
open(IN, ">$filename");
print IN $in{'file'};
close(IN);
------------------
で、テキストファイルの保存は成功したのに何故バイナリは失敗するのか、どんな処理をしたらバイナリファイルを送れるのかがわかりません。よろしくお願いします。
投稿日時 - 2000-11-16 09:46:31
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ