QA@IT
この質問・回答は、@ITの旧掲示板からインポートされたものです。

INPUT TYPE=FILEタグでの入力値保持について

Web Formでファイルのアップロードをするため、
HTMLコントロールのFILEフィールドをサーバコントロールとして使用していますが、
他のフィールドでPostBackした時に入力されていたファイル名が保持されません。
調べてみるとHTMLコントロールでもTEXTフィールドは保持されます。
NGなのはFILEとPASSWORDフィールドだけのようです。
これはそもそもHTMLの仕様なのでしょうか?
ASP.NETの特長であるPostBackを使用する上で障害となるのですが
何か回避策はありませんか?
[ メッセージ編集済み 編集者: nsfj 編集日時 2002-08-11 18:29 ]

質問者:nsfj

回答

ブラウザの仕様では。
HTTP にも HTML にも「ブラウザで back したときの挙動」なんてのは
決められていないと思います。

投稿者:しょむ

編集 履歴 (0)

しょむさん、ありがとうございます。
PostBackの問題というよりやはりHTMLの仕様のようです。
単純なHTMLでINPUT TYPE=FILEタグのVALUE属性に初期値をセットしても無視されるのです。
ASP.NETはこれを自動でやっているだけなのでVALUEが無視されては・・・。
「セキュリティ上の理由」らしいのですが困りました。
PostBackのある画面では使用を避けるしかないのでしょうか?

投稿者:nsfj

編集 履歴 (0)

こんにちは。
HTMLの仕様ですから無理矢理それに反しようとせず、
別の視点で実装してみてはいかがでしょうか?

私も昨年のWEB開発の際にその問題に直面しました。
JavaScriptを使ってみたりと試行錯誤しましたが、
結局実現させることは出来ませんでした。
そこで思いついたのが、メッセージでその旨を伝えることです。
例えば、FILEフィールドに入力後ボタンで次の画面に遷移します。
その画面からボタンでFILEフィールドのある画面に戻る際、
「ファイル1(FILEフィールドの項目名)を再度入力してください。」
とメッセージボックス等で表示してあげるのです。

どうしても出来ないものに時間と力を注ぐより、
別のものでフォローすることもひとつの技術だと思いますがいかがでしょう?

※ちなみに「セキュリティ上の理由」なのは、入力したファイルパスやパスワードに
 値を保持させると、ブラウザの「ソースの表示」で見られるからではないでしょうか?
 私もその辺は良く知りませんが・・・。
 

投稿者:まゆりん

編集 履歴 (0)

javascript でも無理ですね。
まぁ、auto submit ができるわけですから、
たとえばページを開いたときにファイルシステム上の秘密のファイルを
自動送信なんていう危ないことができちゃうと困るわけで。

あきらめましょう。

# ActiveX とかで抜け道は…作れたら作れたでやっぱり問題かな…
# いあ、windowsupdate とかできるんだし何か抜け道がありそうな気がする…

投稿者:しょむ

編集 履歴 (0)

HTMLの仕様ですから無理矢理それに反しようとせず、

ちょっと補足。
すくなくとも W3C HTML 4.x の仕様ではありません。

http://www.w3.org/TR/html401/interact/forms.html#h-17.4.1 より

file

Creates a file select control. User agents may use the value of the value attribute as the initial file name.

ブラウザは、「value 属性の値をファイル名の初期値として 使っても良い (may use)」とあります。
しょむ さんが書かれたように、それでは JavaScript を使って勝手にファイルを送信されてしまいますから、ブラウザの実装としてセキュリティ面からそうしていない、と解釈すべきでしょう。 ("may" なので、実装しなくても規格には合っている。)

投稿者:biac

編集 履歴 (0)

biac様

HTML仕様ではなかったのですね。失礼致しました。
#HTML仕様だと教えてくれた先輩にも違うと教え返します。

仕様では許可されているのに実装では許可されていないというのも
不思議なものですね・・・。

それでは。

投稿者:まゆりん

編集 履歴 (0)

biacさん、詳細な情報ありがとうございました。
HTMLの仕様だと思ってました。
ブラウザでの実装レベルでセキュリティを考慮したわけですね。
勉強になりました。
で、解決策の方もまゆりんさんのおっしゃる通り無理矢理なことはせず、
PostBackする画面とは別にする等実装で工夫したいと思います。
ありがとうございました。

投稿者:nsfj

編集 履歴 (0)
ウォッチ

この質問への回答やコメントをメールでお知らせします。