トップ回答者
IE8でのINPUT TYPE="FILE"フィールドに値をセットする

質問
-
自分で個人的に作っていたツール(C#2008で作成)がWebbrowserコントロールを使用しています
IE上のツールなのですが、IE7までは、
INPUT TYPE="FILE"のフィールドにSendKeyで値を流し込んでいましたが、
IE8では、セキュリティが強化された結果、"FILE"のフィールドはリードオンリーになってしまい、SendKeyが使えなくなってしまいました
何とかして、FILEフィールドに値をセットしたいのですが、代わりになる方法はないでしょうか
さらに言うと、FILEフィールドに値をセットした後、ボタンをクリックする必要があり、その方法を崩したくないです
回答
-
JSなら無理だけど、CGIにファイル名をリクエストして、
それでできる理屈がよく分からなかったのですが、input type="file"タグのvalue属性をCGIに指定させると言うことでしょうか?
HTMLファイルを返却し、
onloadでformのsubmitをonclickさせると出来るかもと思ってたりします。
IE8では、input type="file"タグのvalue属性は無視されますので、その手法では実現できないと思っています。
解決した場合は、参考になった返信に「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に設定できます)。- 回答としてマーク いちろう 2009年7月30日 6:08
-
そうですね。
すみません。根拠無い説明をしてしまいました。
結論としては無理なようです。根拠としては、
MSDNにはinput type=fileプロパティのvalue専用のページが存在し、以下にあります。
http://msdn.microsoft.com/en-us/library/ms535128(VS.85).aspx
HTMLではサポート対象外(N/A)
JavaScriptでは「The property is read-only」
とあり、読み取り専用であることが分かります。(どのIEのバージョンから読み取り専用かは書いてないようです)上記サイトを適当に翻訳しておくと
-----------------
IE8の場合、「セキュリティ設定」の「サーバーにファイルをアップロードするときにローカルディレクトリのパスを含める」の設定によって、
動作が変わります。読み取る場合は、IE8なら「C:\users\contoso\documents\file.txt」が「c:\fakepath\file.txt」に変わります。
詳しくはこちらへ(こちらへの内容としては、「セキュリティ設定」に対応する設定内容(レジストリの値)が記載されている)。
ある人のコメント:'fakepath'って何?ギャグですか?
-----------------outerHTML/innerHTMLやnodeValueなどでももちろん取得不能でしたね。
quirksmodeを見ても書き換えは出来ないとのことです(最後の方参照)。
http://www.quirksmode.org/dom/inputfile.html
(結構昔の記事なのでIE4やNN4で実現する方法がずらずら並んでいるようですが)
# 英語はあんまり読めないけど、大体あってるんじゃないかな。でもファイル選択ダイアログさえ出せば、click()メソッドは効くようです。
(input type=file要素のonchangeメソッドも効いたはずなので、自動アップロードが出来るはず)flash/silverlightでもダメなんじゃないかなと思っています
- 回答としてマーク いちろう 2009年7月30日 6:08
-
いちろうさんの要望は、FILEの値にある特定の値を入れて実現していたもののようなので、
ファイル選択ダイアログで選択したファイル名の正しい取得方法ではないように思えました。
(自分も誤解していたようで少し的外れな内容を書いてしまったようです)さらに、思いついたことを書くと、
ファイル選択ダイアログを出してしまって、
ファイル選択ダイアログのファイル名欄に対してSendKeyをする手は使えませんかね?あと、制約事項を確認させて下さい。答えられる分のみでよいです。
・「個人使用のみのツール」「仲間内のみのツール」「一般人向けに配布するツール」のどれかなのか?
・FILEフィールドに値をセットしたい理由は、ローカルファイルのファイルの中身をサーバ上に送信したいためでよいか?
・上記で送信したい場合の、サーバはどこに存在しているサーバか?ネット上なのかローカルなのか。
・セキュリティゾーンはインターネットゾーンである必要があるか?
・セキュリティ警告は出てもよいか?
・読み取り元の.htmを読む際のパスはhttp://などで始まるURLなのかC:\などのローカルパスなのか?- 回答としてマーク いちろう 2009年7月30日 6:08
すべての返信
-
JSなら無理だけど、CGIにファイル名をリクエストして、
それでできる理屈がよく分からなかったのですが、input type="file"タグのvalue属性をCGIに指定させると言うことでしょうか?
HTMLファイルを返却し、
onloadでformのsubmitをonclickさせると出来るかもと思ってたりします。
IE8では、input type="file"タグのvalue属性は無視されますので、その手法では実現できないと思っています。
解決した場合は、参考になった返信に「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に設定できます)。- 回答としてマーク いちろう 2009年7月30日 6:08
-
そうですね。
すみません。根拠無い説明をしてしまいました。
結論としては無理なようです。根拠としては、
MSDNにはinput type=fileプロパティのvalue専用のページが存在し、以下にあります。
http://msdn.microsoft.com/en-us/library/ms535128(VS.85).aspx
HTMLではサポート対象外(N/A)
JavaScriptでは「The property is read-only」
とあり、読み取り専用であることが分かります。(どのIEのバージョンから読み取り専用かは書いてないようです)上記サイトを適当に翻訳しておくと
-----------------
IE8の場合、「セキュリティ設定」の「サーバーにファイルをアップロードするときにローカルディレクトリのパスを含める」の設定によって、
動作が変わります。読み取る場合は、IE8なら「C:\users\contoso\documents\file.txt」が「c:\fakepath\file.txt」に変わります。
詳しくはこちらへ(こちらへの内容としては、「セキュリティ設定」に対応する設定内容(レジストリの値)が記載されている)。
ある人のコメント:'fakepath'って何?ギャグですか?
-----------------outerHTML/innerHTMLやnodeValueなどでももちろん取得不能でしたね。
quirksmodeを見ても書き換えは出来ないとのことです(最後の方参照)。
http://www.quirksmode.org/dom/inputfile.html
(結構昔の記事なのでIE4やNN4で実現する方法がずらずら並んでいるようですが)
# 英語はあんまり読めないけど、大体あってるんじゃないかな。でもファイル選択ダイアログさえ出せば、click()メソッドは効くようです。
(input type=file要素のonchangeメソッドも効いたはずなので、自動アップロードが出来るはず)flash/silverlightでもダメなんじゃないかなと思っています
- 回答としてマーク いちろう 2009年7月30日 6:08
-
いちろうさんの要望は、FILEの値にある特定の値を入れて実現していたもののようなので、
ファイル選択ダイアログで選択したファイル名の正しい取得方法ではないように思えました。
(自分も誤解していたようで少し的外れな内容を書いてしまったようです)さらに、思いついたことを書くと、
ファイル選択ダイアログを出してしまって、
ファイル選択ダイアログのファイル名欄に対してSendKeyをする手は使えませんかね?あと、制約事項を確認させて下さい。答えられる分のみでよいです。
・「個人使用のみのツール」「仲間内のみのツール」「一般人向けに配布するツール」のどれかなのか?
・FILEフィールドに値をセットしたい理由は、ローカルファイルのファイルの中身をサーバ上に送信したいためでよいか?
・上記で送信したい場合の、サーバはどこに存在しているサーバか?ネット上なのかローカルなのか。
・セキュリティゾーンはインターネットゾーンである必要があるか?
・セキュリティ警告は出てもよいか?
・読み取り元の.htmを読む際のパスはhttp://などで始まるURLなのかC:\などのローカルパスなのか?- 回答としてマーク いちろう 2009年7月30日 6:08