電子書籍の厳選無料作品が豊富!

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を呼んでいます。

A 回答 (2件)

<input type="file"> に対しては、ブラウザ側のセキュリティの配慮により、valueの初期値を設定することができません。

あとからJavaScriptでも操作できないようになっています。

もしこれが可能になってしまうと、ローカルファイルを勝手にアップロードさせることができるようになってしまいます。
JavaScriptを併用すれば「ページを見ただけでファイルをアップロードさせる」も可能ですよね。
Windowsのレジストリなど、パスやファイル名がほぼわかっているファイルであればなおさら危険性が高まります。

なので、一旦必ずファイル選択ダイアログを出すか、テキストボックスに手でファイル名を入力させてからでないとアップロードはできません。
hiddenでファイルをアップロードするのは現時点では無理ではないかと思います。
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/03/24 07:47

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 で指定したファイルを読みとって、メインのフォームの送信データに変換するようなスクリプトを作る必要があります)
といったことになります。
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/03/24 07:46

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!