- ベストアンサー
Perl CGIでアップロードができない
- Perl CGIでファイルのアップロードができない場合、hiddenタグでは値がセットされない問題が発生することがあります。
- javascriptを使用してhiddenタグに値をセットする方法や、javascriptを使用してファイルの選択値をhiddenタグにセットする方法があります。
- 現在は、iframeを使ってファイルの選択値をボタンクリックでメインのformのhiddenタグに渡しています。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
<input type="file"> に対しては、ブラウザ側のセキュリティの配慮により、valueの初期値を設定することができません。あとからJavaScriptでも操作できないようになっています。 もしこれが可能になってしまうと、ローカルファイルを勝手にアップロードさせることができるようになってしまいます。 JavaScriptを併用すれば「ページを見ただけでファイルをアップロードさせる」も可能ですよね。 Windowsのレジストリなど、パスやファイル名がほぼわかっているファイルであればなおさら危険性が高まります。 なので、一旦必ずファイル選択ダイアログを出すか、テキストボックスに手でファイル名を入力させてからでないとアップロードはできません。 hiddenでファイルをアップロードするのは現時点では無理ではないかと思います。
その他の回答 (1)
- mtaka2
- ベストアンサー率73% (867/1179)
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 で指定したファイルを読みとって、メインのフォームの送信データに変換するようなスクリプトを作る必要があります) といったことになります。
お礼
ありがとうございます。 セキュリティの問題からなのですね。
お礼
ありがとうございます。 FILEを用意しないとダメなのですね。 よく理解できました。