
Perlを使用してCGIのアップローダーを作成しています。
http://oshiete1.goo.ne.jp/kotaeru.php3?q=1177414
の続きなのですが、Web上にあるコードを持ってきて、自分なりに変更してみました。
上記のものだと、ラジオボタンがないので、そこを追加して、さらに拡張子に何がくるかわからないので下記のようにして拡張子を求めました。
##################
# 拡張子を求める #
##################
$filename = $in{'upfile'};
$substrings = ".";
$position = rindex $filename, $substrings;
$file_type = substr($filename, $position);
$fnme = $fnme . $file_type;
# 受信データを書き込む
open OUT,">$fnme";
binmode OUT;
print OUT $in{'upfile'};
close OUT;
$mes = '書き込みが完了しました。';
無事拡張子も出て、「sample.***」という感じでアップロードできたのですが、アップロードできたこのファイルを開こうとすると、
gifは「種類を特定できません」、bmpは「このファイルは読み取れません。このビットマップファイルは無効であるか、または現在サポートされていない形式です」
と出てしまいました。
こんな風に拡張子を取得したのではダメなのでしょうか?
No.2ベストアンサー
- 回答日時:
enctype="multipart/form-data"
がないと、ファイルの実体はサーバに送信されませんので消してはダメです。
radioボタンの受け取りは元のソースにはない部分でもあるし、追加したであろうその部分に問題があるかと思います。
また、enctype="multipart/form-data"を付けると、$in{'upfile'}にはアップロードしたファイルの実体が格納されてきますので、ファイル名は元ソースのように @in から求める必要があります。
この回答への補足
無理やりな方法ですが、自分なりに考えて長々とコードを書いて、無事完成させることができました!
人がみたら変なコードだと思いますが、自分で考えたコードなのでちょっとうれしいです(^^)
教えていただいてありがとうございました。
回答ありがとうございます。
金曜は焦っていたんだなぁと自分でも文章を見て思います(笑
以下のようにしてみました。
htmlの文章
<HTML>
<HEAD>
<META http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<TITLE>アップロード</TITLE>
</HEAD>
<BODY>
<FORM method="POST" action="2.cgi" enctype="multipart/form-data">
<INPUT TYPE=RADIO NAME="folder" VALUE="a">a
<BR>
<INPUT size="40" type="file" name="upfile">
<INPUT type="submit" value="送信する">
</FORM>
</BODY>
</HTML>
cgiの方で@inをprintで見てみると
Content-Disposition: form-data; name="folder" Content-Disposition: form-data; name="upfile"; filename="*****\mark.gif" Content-Type: image/gif
と出てきました。
こうするとラジオボタンの中身は入ってこないですよね?
ラジオボタンのデータを取得するにはどうしたらいいのでしょうか?
通常のcgiだと上記のようにすれば取得できると思うのですが…。
またcgiの中の拡張子を取得する箇所で
if ($tmp =~ /(.*)Content-type:(.*)/i){
と
if ($2 =~ /image\/jpeg/i) { $ext = '.jpg'; }
という表記がありますが、意味はなんとなくわかりますが、コードの意味がイマイチわかりません。
No.1
- 回答日時:
$in{'upfile'}はファイル名の情報用のだけで、ファイルの中身(バイナリデータ)は、入っていないのでしょう。
(そもそも混在させているというのはありえないので)試しにアップロードされたファイルをテキストエディタなりバイナリエディタなりで開いて確認してみましょう。
「Web上にあるコードを持ってきて、自分なりに変更してみました」だけでかつ上記のソースコードの提示だけではこれしか答えられません。
この回答への補足
変更箇所はこんなところです。
<META http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
|
|
▽
<META http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<META http-equiv="Content-Style-Type" content="text/css">
(参考にしたサイト様でラジオボタンを使ったフォームの箇所に2行目が書いてあったので、こうしたらつくのかなぁ?とか思い付け足してみる)
あと、これがいけないのかなぁ?と思うのは
<FORM method="POST" action="./test.cgi" enctype="multipart/form-data">
を
<FORM method="POST" action="./test.cgi">
としたことです。
画像などのデータを送る場合は…と書いてあるのでこれを消してしまうとダメなのかと。。
でも
<FORM method="POST" action="./test.cgi" enctype="multipart/form-data">
としてしまうとラジオボタンのデータがうまく受け渡しできないのです。
上記のものを消すとなぜかうまくいって。
でもこれが原因のような気がしてなりません。
回答ありがとうございます。
ためしに開いてみたところ、パスとファイル名のみが表示されました…。
>「Web上にあるコードを持ってきて、自分なりに変更してみました」だけでかつ上記のソースコードの提示だけではこれしか答えられません。
質問文にもかいてあるのですが、
http://oshiete1.goo.ne.jp/kotaeru.php3?q=1177414
の続きなのです。
何度もURLを載せるのも悪いかなと思い、今回は載せませんでしたが、実際のコードは
http://www.aimix.jp/cgi/acccgilibupfile.html
です。
ここには、それぞれの拡張子についてのif文があるのですが、どんな拡張子でも載せられたら、と思い
質問文のように変更してみたんですが、変更の仕方が悪かったんですね。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
EXCELファイルに誰がアクセスし...
-
《エクセルVBA》「他の人が該当...
-
サーバー上のフォルダ削除が出...
-
vbでFTPサーバーに対して、サー...
-
basp21でのファイルアップロー...
-
VBAでサーバーにアクセスするに...
-
ブラウザの戻るボタンでの動き...
-
HPで流す音楽
-
Webフォルダでサーバーからイン...
-
CGIを使用してブラウザからファ...
-
cgiのメールでファイルを添付し...
-
JAVAで別サーバーのファイルの...
-
C# ファイル削除のエラーコード
-
30分ごとに更新
-
ファイルアップロードCGIを教え...
-
自前のアップローダの作り方
-
URLに~/cgi-bin/~を隠す方法
-
KENT WEB(昨日の続きです)
-
ASP(IIS?)のエラーについて
-
CGIでソースがそのままでてしま...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
EXCELファイルに誰がアクセスし...
-
《エクセルVBA》「他の人が該当...
-
VBAでサーバーにアクセスするに...
-
VBScriptで、ファイルから任意...
-
vbでFTPサーバーに対して、サー...
-
tplファイルのプレビューの方法
-
Perl 別ドメインのファイル存在...
-
C# ファイル削除のエラーコード
-
空のファイル
-
HP上への音楽の貼り付け方
-
JAVAで別サーバーのファイルの...
-
サーバー上のフォルダ削除が出...
-
30分ごとに更新
-
Dreamweaver(ドリームウィーバ...
-
Webフォルダでサーバーからイン...
-
HTML5のFileAPIでファイルの存...
-
cgiのメールでファイルを添付し...
-
ファイルアップロードCGIを教え...
-
CGIを使用してブラウザからファ...
-
ブラウザの戻るボタンでの動き...
おすすめ情報