- ベストアンサー
バイナリファイルのアップロードに失敗する理由と解決方法
- バイナリファイルのアップロードが失敗する理由と解決方法を教えてください。
- バイナリファイルのアップロードができても開けない場合や、画像が崩れる場合があります。
- どこを修正すれば問題が解決するのでしょうか。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
補足見ました。 根本的に説明が間違ってましたねー(^_^; えとですね。 print文はバイナリファイルには使えません。 syswrite関数を使います。 詳細は下記参照のこと。
その他の回答 (3)
補足見ました。 まず、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>; で中身を読み込みます。 以上です。 他に分からないことがあったら別途補足を下さい。
補足
私が何をしたいかというと、ファイルをそのファイル名のまま保存したいということです。ReadParseでファイルを送る場合、引数を指定しないと、第1引数(この場合はファイルの中身)のみが出されますよね。今回はファイル名も欲しいので第2引数f_nameも指定しました。(cgi-libでは*incfnになっていました。名前を変えてしまってすいません。)それで、 ------------------ ↓ここでファイル名を処理をして $f_name{'file'}=~/([^\\\/]+)$/; $filename = $1; ------------------ ↓ここからそのファイル名で新規ファイルをオープン・保存してみました。 open(IN, ">$filename"); print IN $in{'file'}; close(IN); ------------------ で、テキストファイルの保存は成功したのに何故バイナリは失敗するのか、どんな処理をしたらバイナリファイルを送れるのかがわかりません。よろしくお願いします。
これ、ReadParseの中でなにやってるんでしょうか? Perlの標準関数じゃないですよね。 もしこれが cgi-lib.pl で定義された関数なのであれば、使い方が違いますよ。
補足
cgi-libの中のReadParse関数を使用しています。v 2.18をコメントを読みながら使用しているのですが、学生時代英語の成績が悪かったので使い方には全く自信ないです。正しい使い方や、簡単に説明して下さるページ等教えて下さい! プログラムを見ると、バイナリの中に\r\nが含まれている場合に失敗するのではないかと思っているのですが…。
- miy2021
- ベストアンサー率29% (7/24)
テキストファイルは、ASCIIでそのまま送れるのに対して、バイナリファイルは、バイナリだ、ということを認識させないとだめだと思うのです。 ですから、ファイルのタイプによって、転送時のモードを変更するようにしてやればいいと思うのですが。perlはよくわからないのですが、多分そういうことだと思います。
お礼
回答ありがとうございました!
お礼
何度もありがとうございました!行ってみます!