none
IE8でのINPUT TYPE="FILE"フィールドに値をセットする RRS feed

  • 質問

  • 自分で個人的に作っていたツール(C#2008で作成)がWebbrowserコントロールを使用しています
    IE上のツールなのですが、IE7までは、
    INPUT TYPE="FILE"のフィールドにSendKeyで値を流し込んでいましたが、
    IE8では、セキュリティが強化された結果、"FILE"のフィールドはリードオンリーになってしまい、SendKeyが使えなくなってしまいました

    何とかして、FILEフィールドに値をセットしたいのですが、代わりになる方法はないでしょうか

    さらに言うと、FILEフィールドに値をセットした後、ボタンをクリックする必要があり、その方法を崩したくないです
    2009年7月15日 17:04

回答

  • 過去に似たような話がありました。
    http://social.msdn.microsoft.com/Forums/ja-JP/csharpgeneralja/thread/cf8d535e-81b8-4bb8-877f-b269c6f1ae90


    基本的にはできないと捉えておくべきではないかと思います。
    解決した場合は、参考になった返信に「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に設定できます)。
    • 回答としてマーク いちろう 2009年7月30日 6:09
    2009年7月16日 13:59
  • 私も知りませんね。(聞いてないだろ)
    2chのJavaScriptスレッドのFAQ16でも不可能ってことになっています(というかそうした)。

    JSなら無理だけど、CGIにファイル名をリクエストして、
    HTMLファイルを返却し、
    onloadでformのsubmitをonclickさせると出来るかもと思ってたりします。

    • 回答としてマーク いちろう 2009年7月30日 6:08
    2009年7月17日 13:45
  • JSなら無理だけど、CGIにファイル名をリクエストして、
    HTMLファイルを返却し、
    onloadでformのsubmitをonclickさせると出来るかもと思ってたりします。
    それでできる理屈がよく分からなかったのですが、input type="file"タグのvalue属性をCGIに指定させると言うことでしょうか?
    IE8では、input type="file"タグのvalue属性は無視されますので、その手法では実現できないと思っています。

    解決した場合は、参考になった返信に「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に設定できます)。
    • 回答としてマーク いちろう 2009年7月30日 6:08
    2009年7月17日 14:11
  • そうですね。

    すみません。根拠無い説明をしてしまいました。
    結論としては無理なようです。

    根拠としては、
    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
    2009年7月17日 15:00
    • 回答としてマーク いちろう 2009年7月30日 6:08
    2009年7月18日 11:36
  • いちろうさんの要望は、FILEの値にある特定の値を入れて実現していたもののようなので、
    ファイル選択ダイアログで選択したファイル名の正しい取得方法ではないように思えました。
    (自分も誤解していたようで少し的外れな内容を書いてしまったようです)

    さらに、思いついたことを書くと、
    ファイル選択ダイアログを出してしまって、
    ファイル選択ダイアログのファイル名欄に対してSendKeyをする手は使えませんかね?

    あと、制約事項を確認させて下さい。答えられる分のみでよいです。
    ・「個人使用のみのツール」「仲間内のみのツール」「一般人向けに配布するツール」のどれかなのか?
    ・FILEフィールドに値をセットしたい理由は、ローカルファイルのファイルの中身をサーバ上に送信したいためでよいか?
    ・上記で送信したい場合の、サーバはどこに存在しているサーバか?ネット上なのかローカルなのか。
    ・セキュリティゾーンはインターネットゾーンである必要があるか?
    ・セキュリティ警告は出てもよいか?
    ・読み取り元の.htmを読む際のパスはhttp://などで始まるURLなのかC:\などのローカルパスなのか?

    • 回答としてマーク いちろう 2009年7月30日 6:08
    2009年7月18日 17:04
  • さらに、思いついたことを書くと、
    ファイル選択ダイアログを出してしまって、
    ファイル選択ダイアログのファイル名欄に対してSendKeyをする手は使えませんかね?

    そういう例です。
    • 回答としてマーク いちろう 2009年7月30日 6:08
    2009年7月18日 17:32

すべての返信

  • 過去に似たような話がありました。
    http://social.msdn.microsoft.com/Forums/ja-JP/csharpgeneralja/thread/cf8d535e-81b8-4bb8-877f-b269c6f1ae90


    基本的にはできないと捉えておくべきではないかと思います。
    解決した場合は、参考になった返信に「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に設定できます)。
    • 回答としてマーク いちろう 2009年7月30日 6:09
    2009年7月16日 13:59
  • 私も知りませんね。(聞いてないだろ)
    2chのJavaScriptスレッドのFAQ16でも不可能ってことになっています(というかそうした)。

    JSなら無理だけど、CGIにファイル名をリクエストして、
    HTMLファイルを返却し、
    onloadでformのsubmitをonclickさせると出来るかもと思ってたりします。

    • 回答としてマーク いちろう 2009年7月30日 6:08
    2009年7月17日 13:45
  • JSなら無理だけど、CGIにファイル名をリクエストして、
    HTMLファイルを返却し、
    onloadでformのsubmitをonclickさせると出来るかもと思ってたりします。
    それでできる理屈がよく分からなかったのですが、input type="file"タグのvalue属性をCGIに指定させると言うことでしょうか?
    IE8では、input type="file"タグのvalue属性は無視されますので、その手法では実現できないと思っています。

    解決した場合は、参考になった返信に「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に設定できます)。
    • 回答としてマーク いちろう 2009年7月30日 6:08
    2009年7月17日 14:11
  • そうですね。

    すみません。根拠無い説明をしてしまいました。
    結論としては無理なようです。

    根拠としては、
    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
    2009年7月17日 15:00
    • 回答としてマーク いちろう 2009年7月30日 6:08
    2009年7月18日 11:36
  • いちろうさんの要望は、FILEの値にある特定の値を入れて実現していたもののようなので、
    ファイル選択ダイアログで選択したファイル名の正しい取得方法ではないように思えました。
    (自分も誤解していたようで少し的外れな内容を書いてしまったようです)

    さらに、思いついたことを書くと、
    ファイル選択ダイアログを出してしまって、
    ファイル選択ダイアログのファイル名欄に対してSendKeyをする手は使えませんかね?

    あと、制約事項を確認させて下さい。答えられる分のみでよいです。
    ・「個人使用のみのツール」「仲間内のみのツール」「一般人向けに配布するツール」のどれかなのか?
    ・FILEフィールドに値をセットしたい理由は、ローカルファイルのファイルの中身をサーバ上に送信したいためでよいか?
    ・上記で送信したい場合の、サーバはどこに存在しているサーバか?ネット上なのかローカルなのか。
    ・セキュリティゾーンはインターネットゾーンである必要があるか?
    ・セキュリティ警告は出てもよいか?
    ・読み取り元の.htmを読む際のパスはhttp://などで始まるURLなのかC:\などのローカルパスなのか?

    • 回答としてマーク いちろう 2009年7月30日 6:08
    2009年7月18日 17:04
  • さらに、思いついたことを書くと、
    ファイル選択ダイアログを出してしまって、
    ファイル選択ダイアログのファイル名欄に対してSendKeyをする手は使えませんかね?

    そういう例です。
    • 回答としてマーク いちろう 2009年7月30日 6:08
    2009年7月18日 17:32
  • 皆さん。ありがとうございます。
    仲間内で使うプログラムなので、見た目は気にせず
    SendKeyでダイアログボックスを表示させて、
    SendKeyで、ダイアログに無理矢理文字入力するようにします
    2009年7月30日 6:08