• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:ReadParseを使ってのバイナリファイルのアップロード)

バイナリファイルのアップロードに失敗する理由と解決方法

このQ&Aのポイント
  • バイナリファイルのアップロードが失敗する理由と解決方法を教えてください。
  • バイナリファイルのアップロードができても開けない場合や、画像が崩れる場合があります。
  • どこを修正すれば問題が解決するのでしょうか。

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

  • ベストアンサー
noname#25358
noname#25358
回答No.4

 補足見ました。  根本的に説明が間違ってましたねー(^_^;  えとですね。  print文はバイナリファイルには使えません。  syswrite関数を使います。  詳細は下記参照のこと。

参考URL:
http://cgi.linkclub.or.jp/~syouei/fp/
ryogoku
質問者

お礼

何度もありがとうございました!行ってみます!

その他の回答 (3)

noname#25358
noname#25358
回答No.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>;  で中身を読み込みます。  以上です。  他に分からないことがあったら別途補足を下さい。

ryogoku
質問者

補足

私が何をしたいかというと、ファイルをそのファイル名のまま保存したいということです。ReadParseでファイルを送る場合、引数を指定しないと、第1引数(この場合はファイルの中身)のみが出されますよね。今回はファイル名も欲しいので第2引数f_nameも指定しました。(cgi-libでは*incfnになっていました。名前を変えてしまってすいません。)それで、 ------------------ ↓ここでファイル名を処理をして $f_name{'file'}=~/([^\\\/]+)$/; $filename = $1; ------------------ ↓ここからそのファイル名で新規ファイルをオープン・保存してみました。 open(IN, ">$filename"); print IN $in{'file'}; close(IN); ------------------ で、テキストファイルの保存は成功したのに何故バイナリは失敗するのか、どんな処理をしたらバイナリファイルを送れるのかがわかりません。よろしくお願いします。

noname#25358
noname#25358
回答No.2

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

ryogoku
質問者

補足

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

  • miy2021
  • ベストアンサー率29% (7/24)
回答No.1

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

ryogoku
質問者

お礼

回答ありがとうございました!