Perl CGIでアップロードができない

このQ&Aのポイント
  • Perl CGIでファイルのアップロードができない場合、hiddenタグでは値がセットされない問題が発生することがあります。
  • javascriptを使用してhiddenタグに値をセットする方法や、javascriptを使用してファイルの選択値をhiddenタグにセットする方法があります。
  • 現在は、iframeを使ってファイルの選択値をボタンクリックでメインのformのhiddenタグに渡しています。
回答を見る
  • ベストアンサー

Perl CGIで、アップロードができない

Perl my $fhandle = $query ->upload('A'); HTML <INPUT TYPE="HIDDEN" VALUE="C:\temp\1.txt"/> ボタンクリックで、JavaScriptでHTMLのhiddenに値をセットしています。 その値をPerlでuploadすると、値がセットされません。 <INPUT TYPE="FILE" で、手動でセットすると上手くいきます。 なんんとかHIDDENでできないでしょうか? FILEでしか駄目な場合、JavaScriptで、FILEにセットする方法をご教授下さい。 今、現状はIFRAMEでFILEで選択したファイルパスをボタンクリックで、メインのFORMのHIDDENに渡して、CGIを呼んでいます。

  • Perl
  • 回答数2
  • ありがとう数2

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

  • ベストアンサー
回答No.2

<input type="file"> に対しては、ブラウザ側のセキュリティの配慮により、valueの初期値を設定することができません。あとからJavaScriptでも操作できないようになっています。 もしこれが可能になってしまうと、ローカルファイルを勝手にアップロードさせることができるようになってしまいます。 JavaScriptを併用すれば「ページを見ただけでファイルをアップロードさせる」も可能ですよね。 Windowsのレジストリなど、パスやファイル名がほぼわかっているファイルであればなおさら危険性が高まります。 なので、一旦必ずファイル選択ダイアログを出すか、テキストボックスに手でファイル名を入力させてからでないとアップロードはできません。 hiddenでファイルをアップロードするのは現時点では無理ではないかと思います。

Mark0817
質問者

お礼

ありがとうございます。 FILEを用意しないとダメなのですね。 よく理解できました。

その他の回答 (1)

  • mtaka2
  • ベストアンサー率73% (867/1179)
回答No.1

Perlの問題ではなく、HTMLとJavaScriptの方の問題です。 > 現状はIFRAMEでFILEで選択したファイルパスをボタンクリックで、メインのFORMのHIDDENに渡して INPUT TYPE=FILE 以外ではファイルをアップ(ファイルの内容を送信)することはできません。HIDDEN で渡しても、「C:\temp\1.txt」という文字列がCGIに送信されるだけです。 フォームでのファイル送信は、INPUT TYPE=FILE でしか出来ません。 さらに、セキュリティ的な問題から、INPUT TYPE=FILE で、送信するファイルのファイル名をJavaScript等から書き換える(指定する)ことはできません。ファイル名を自由に替えられるということは、クライアントのPC内にあるどんなファイルでも送信できることになり、悪意のあるスクリプトが情報を盗み出すことが可能になるからです。 つまり、基本的には「INPUT TYPE=FILE で、ファイルを選択して、それをそのまま送信する」以外の方法でファイルをアップすることはできないのです。 ただし、HTML5では条件は変わります。HTML5で新設された File API を使えば、 INPUT TYPE=FILE で指定したファイルの内容を JavaScript で読み出すことが可能になります。 (上述のセキュリティ観点から、自由にファイルを指定することはできません。読み込めるのはあくまで INPUT TYPE=FILE で、利用者が指定したファイルだけです) これを使えば質問者さんの要望には沿ったものを実現可能ですが、 ・HTML5 に対応したブラウザでしか使えない(Internet Explorer は対応してない) ・JavaScriptのプログラムが必要(iframeの方のINPUT TYPE=FILE で指定したファイルを読みとって、メインのフォームの送信データに変換するようなスクリプトを作る必要があります) といったことになります。

Mark0817
質問者

お礼

ありがとうございます。 セキュリティの問題からなのですね。

関連するQ&A

  • Perlでファイルをアップロードしたい

    えーPerlを使用してローカルからサーバーへFTPを使わず、かつパスを指定してファイル(CSV)をアップロードさせたいのですが、フォームの<input type="file"...>ではファイルを参照ボタンで指定せなだめなため使いたくないのです。一瞬フォームから<input type="hidden">を使用してファイルの中身をデータにして送りサーバでファイルを作ろうかとも考えたのですがサーバ側に負担がかかりそうで・・・教えてください。お願いします。

  • Perlでファイルをアップロードさせたい

    えーPerlを使用してローカルからサーバーへFTPを使わず、かつパスを指定してファイル(CSV)をアップロードさせたいのですが、フォームの<input type="file"...>ではファイルを参照ボタンで指定せなだめなため使いたくないのです。一瞬フォームから<input type="hidden">を使用してファイルの中身をデータにして送りサーバでファイルを作ろうかとも考えたのですがサーバ側に負担がかかりそうで・・・教えてください。お願いします。

    • 締切済み
    • CGI
  • アップロードができるようにしたいのですが・・。

    こんにちは。お世話様になります。 ホームページで画像などがアップできて、表示ができるようにアップロードボタンを作りたいと思っています。 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>画面遷移なしでファイル(画像)アップロード</title> </head> <body> <form action="http://●●●/upload.php" method="post" enctype="multipart/form-data" target="upload_frame"> <input type="hidden" name="max_file_size" value="1000000" /> <input type="file" name="upload_image" /> <input type="submit" value="画像アップロード" /> </form> <div id="container"></div> <iframe name="upload_frame" style="display:none;"></iframe> </body> </html> ---phpファイル---- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>画像アップロード(iframe内)</title> </head> <body> <?php $upload_dir = './'; $filename = $_FILES['upload_image']['name']; move_uploaded_file($_FILES['upload_image']['tmp_name'], $upload_dir.$filename); ?> <script type="text/javascript"><!-- var container = parent.document.getElementById('container'); image = parent.document.createElement('img'); image.src = './<?php print($filename);?>'; container.appendChild(image); //--></script> </body> </html> ネットで調べて、このようにしたのですが、画像をアップしようとしても表示されません。  何がいけないのでしょうか・・・。 大変恐れ入りますが、詳しい方はご教示くださいませ。  宜しくお願い致します。

  • Perl(cgi)でこれはできますか?

    今まで、デスクトップ上にあるJAVAのプログラムで、 http://***.ne.jp を解析して、その中から、ある値を含む条件のURLのみを抜き出してHTMLリンク集を作っていました。 この作業を、ウェブベース(sakura.ne.jpのライトプランで利用予定。使用可能言語は多分perlのcgiのみ)で行うことはできないものかと思っております。 具体的には、 インプットボックスに、解析したいURLを入れて、検索ボタンを押すと、そのURLの文章の中から必要な文章のみを抜き出してそれと、HTMLリンク集にして返すというプログラムです。 また、perlやcgiは今まで殆ど触ったことが無い言語なので、どんなことでも、参考になりそうなことがありましたら是非是非、ご紹介ください。 宜しくお願い致します。

    • ベストアンサー
    • Perl
  • ファイル選択と同時にアップロード HTML+JS

    HTMLとJava Scriptのことを質問させてください <form>タグからファイルを選択すると同時をアップロードしたいと思っています。 複数の「ファイルを選択ボタン」を設置し、それぞれ"001.jpg"、"002.jpg"など指定の名前でアップロードしたいです。 下記のようにいくつかの<form>タグを設置し、javascriptでコントロールできるかと思いケース1のように書いた場合はうまくいったのですが、ケース2のように複数並べて記述した場合、動かなくなり困っております。 どなたか教えていただけないでしょうか? よろしくお願いいたします ケース1) <form id="upload_file1" action="file_upload.php" method="post" enctype="multipart/form-data" target="upload_frame">    <input type="hidden" name="picture_id" value="001.jpg" />    <input type="file" id="file_id_1" name="file_name" accept="image/jpeg"> </form> <form id="upload_file2" action="file_upload.php" method="post" enctype="multipart/form-data" target="upload_frame">    <input type="hidden" name="picture_id" value="002.jpg" />    <input type="file" id="file_id_2" name="file_name" accept="image/jpeg"> </form> <script> var form = document.getElementById("upload_file1"); var input = form.file_name; input.onchange = function (){ if(this.value){ form.submit(); } }; </script> ケース2) <form id="upload_file1" action="file_upload.php" method="post" enctype="multipart/form-data" target="upload_frame">    <input type="hidden" name="picture_id" value="001.jpg" />    <input type="file" id="file_id_1" name="file_name" accept="image/jpeg"> </form> <form id="upload_file2" action="file_upload.php" method="post" enctype="multipart/form-data" target="upload_frame">    <input type="hidden" name="picture_id" value="002.jpg" />    <input type="file" id="file_id_2" name="file_name" accept="image/jpeg"> </form> <script> var form = document.getElementById("upload_file1"); var input = form.file_name; input.onchange = function (){ if(this.value){ form.submit(); } }; var form = document.getElementById("upload_file2"); var input = form.file_name; input.onchange = function (){ if(this.value){ form.submit(); } }; </script>

  • PHP用ファイルアップロード機能について

    ドコモ端末でPHPのファイルアップロード機能を使えるようにしたいのですが、どのようにすればいいでしょうか? ちなみに、vodafoneならこの機能が使えます。 ドコモ端末で下のソースにアクセスすると、 ファイルを参照するボタンが見えず、ファイルをアップロードできません。 HTMLはキャリア毎に使えるタグがあるのは知っていますが、下のソースの場合はどのように変更すれば良いのでしょうか?ご教授下さい。宜しくお願いします。 #ソースはコレです。 <form method="post" action="upload_save.php" enctype="multipart/form-data"> <input type="hidden" name="max_file_size" value="1000000" /> <input type="file" name="upload_file" size="70"><br /> (上書き禁止) <input type="checkbox" name="forbidden" value="1" checked /> <input type="submit" value="アップロード" /> </form> #ファイル自体はphpですが、中身はほぼHTMLに関する質問になってしまい、申し訳ありません。

    • ベストアンサー
    • PHP
  • perl/cgiについて、教えて下さい。

    perl/cgiについて、教えて下さい。 下記のようなことを、行いたいと考えています。 とりあえず、  a.html  b.html  c.html があり、 __________________________________ 1:それぞれ、フォームに、テキストボックスが一つあります。 2:他のフォームに遷移できます。(例:a.htmlからc.hmtlのように) 3:各フォームに「A、B、Cの値を確認」ボタンがあります。 4:3のボタンをクリックすると、各テキストボックスで入力した 値が表示される。 【イメージ】 a.htmlのテキストボックスに、100を入力 b.htmlのテキストボックスに、200を入力 c.htmlのテキストボックスに、300を入力 した場合。 Aで入力された値は100です。 Bで入力された値は200です。 Cで入力された値は300です。 ______________________________________ と表示させる、cgiを作成したいです。 又、その際、hiddenを使用して行う方法(手順)を教えて頂けないでしょうか。 ファイルに書き込むことで、値を保持しておくのではと 考えましたが、a.htmlの値100を書き込み、再度、a.htmlの 値を書き込むと、a.htmlのフォームから送られた値が2つ(1回目、2回目)書き込まれた 状態になるように思います。 今回のように、例えば、ファームの入力値を保持して他の(b.thmlなど)に 遷移し、ボタンをクリックすると、全フォームの値を表示するような場合、 どのような方法が考えられるのでしょうか? どうぞ、宜しくお願いいたします。

    • ベストアンサー
    • Perl
  • ファイルアップロードについて

    ファイルアップロードについて質問させて下さい。 ID、ファイルアップロードの機能の2つがあります。 ファイルを指定し、submitボタンを押下すると「b.php」に遷移します。 ファイルをアップロードした場合には遷移をせず ID、画像パスが入力されている場合のみ「b.php」に遷移したいのです。 入力チェックはjavascriptで行っていますが、その場合には「action=""」として javascript側で遷移するしか方法は無いのでしょうか? ---a.php---- <form enctype="multipart/form-data" action="b.php" method="post" name="a"> <input type="hidden" name="MAX_FILE_SIZE" value="50000000" /> <table> <tr> <th>ID</th> <td><input type="text" name="ID" value=""></td> </tr> <tr> <th>画像</th> <td><input type="file" name="img" value=""> <input type="submit" name="upload" value="upload"> </td> </tr> </table> <a href="#" onClick="javascript:check('a');"><img src="button.jpg"></a> </form> お手数ですが、ご教授よろしくお願い致します。

    • ベストアンサー
    • PHP
  • ファイル選択ダイアログが表示しない

    javascriptで<INPUT type=file name=faile1>を file1.click();でクリックしてファイル選択ダイアログを表示させようとしても表示しません。 formから <INPUT type=file id=file1 name=image style="DISPLAY: none"> <INPUT type="image" src="./img/up02.jpg" id=button1 value=Button name=button1 を出すとファイル選択ダイアログが表示されます。 独自のボタンイメージでファイル選択ダイアログを表示したいために <INPUT type="image"をクリックされたときにjavascriptで <INPUT type=file をクリックさせています。 したいことは、独自のボタンで、ファイル選択ダイアログを表示して、 phpに選択されたファイルパスを送信したいです。 下記コードをご参考にしてください。 <html> <head> <title>upload test</title> </head> <body> 何かの編集ページとか <iframe name="uploader" src="" style="width:0px;height:0px;border:0px;"></iframe> <form name=form1 target="uploader" method="POST" action="http://*.**.**.*/test.php" enctype="multipart/form-data"> <INPUT type=file id=file1 name=image style="DISPLAY: none"> <INPUT type="image" src="./img/up02.jpg" id=button1 value=Button name=button1 LANGUAGE=javascript onclick="return button1_onclick()"/> </form> <script type="text/javascript"> <!-- function button1_onclick() { window.alert("クリックされた"); file1.click(); document.form1.submit(); } //--> </script> </body> </html>

  • JavaScriptからPerlへデータを送る方法について

    プログラミング初心者です。 HTMLで書いたフォームの中にあるテキストエリアのデータを、JavaScriptでデータを取り出して、それをPerlで受け取りたいのですが、方法に見当がつきません。 以下は書いてみたソースコードです。 HTMLファイル <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Form Test</title> <script type="text/javascript" src="JS/sample.js"></script> </head> <body> <form name=form1> <textarea name="comment" rows="3" cols="30">文字の入力</textarea> <input type="button" value="ボタン" onClick="Button()"> </form> </body> </html> JavaScriptファイル function Button(){ var comment = document.form1.comment.value; alert(comment); //値がとれてるか確認したかっただけです } Perlに関しては、#!/usr/bin/perl ぐらいしか、まだ分かりません。 よろしければ、JavaScriptからのデータ送信、Perlでのデータ受け取り方法を教えていただけないでしょうか。この質問に対して有効なサイトがあれば合わせて教えていただきたくおもいます。 よろしくお願いします。