- - PR -
<input type="file"> に手入力したときの動き
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2007-12-28 10:11
開発はASP.NET2.0なのですが、HTMLレベルの動作な気がするのでこちらに投稿しました。
OSはWindowsXP、ブラウザはIE6です。 ASP.NETの画面にファイルのアップロード用のコントロールを貼り付けているのですが、 利用者が間違えて、そこに手入力でおかしな文字列(hogeとか)を入力したときに、 ポストバックがかからないという現象にあっています。 調べた結果、<input type="file"> にname属性をつける/つけないで submitされる/されないの挙動が変わることまでは突き止めました。 また、FireFox(2.0.0.7)ではどちらの場合もsubmitされることもわかりました。
が、開発自体はASP.NETなので、name属性を消すわけにもいかず、 ブラウザはIE6と決めて開発しているので、今更変えるわけにもいきません。 とりあえず、利用者へは「IEの仕様」で説明するつもりなのですが、 現象としては気になるので、何か情報がいただければと思い、投稿しました。 よろしくお願いします。 # 書いているうちにjavascriptでチェックできる可能性を考えましたが、 # これはまだ試してません。 | ||||||||
|
投稿日時: 2007-12-28 11:11
Input type = file 属性の入力フォームにて submit を行っても Web サーバーから反応がない
XPSP2のセキュリティ上の問題のようです またJavaScriptからも<input type="file">に対してアクセスできないようになっています これもまたセキュリティ上 | ||||||||
|
投稿日時: 2007-12-28 11:42
なぎさ。さん。情報ありがとうございます。
リンク先の文書を読みました。OSは Windows XP Professional SP2 です。 Firefoxで再現しないところから推測すると、OSがSP1からSP2にアップデートしたときに IE6の動作がそのように変わったのですね、きっと。 name属性の有無で動きが変わる点がまだしっくりこないのですが、 OSおよびIEの仕様なのでどうしようもない、ということは説明できそうです。 ありがとうございます。 | ||||||||
|
投稿日時: 2007-12-28 11:59
nameの有無は
PG言語で言う変数の宣言の有無と同じものなのでしょう nameがあるからこそvalueが存在できるので <form>から認識してもらえないのではないでしょうか type="text"や type="hidden"のname無しもsubmitは動きますが値そのものは送信されませんでした <form>から認識されて初めてsubmitされて submitを行う途中にtype=fileがある場合ファイルパスが正しいかどうかチェックが行われている ファイルアップロードはそれなりにリスクが伴いますからセキュリティが高いのは当然なのでしょうね | ||||||||
|
投稿日時: 2007-12-28 13:13
nameがダメならidなら取得できるかな? と思い、
実際にこんなHTMLを書いてみました。
これに何かしら文字列を入力をしてsubmitボタンを押すと、 type=fileの場合でも入力した文字列を取得することができました。 なので入力文字列をチェックして、書式が変だったら アラートを表示するようなJavaScriptを仕込むことができれば、 利用者に知らせることは可能かな、と考えた次第です。 画面上で知らせられればいいので、submitで値が送信されなくてもとりあえずは問題ありません。 # 私の書いたコードで、値が送信されたのか、されてないのかはよく理解していません。 ただ実際にはASP.NETなので、nameを無くすのはたぶん無理だと思いますが... | ||||||||
|
投稿日時: 2007-12-28 15:03
こんにちは
値のチェックをするなら form の onSubmitを使ったほうがいいと思います。 コードを少し改造
onSubmit="return 関数();" と書くことで関数戻り値が falseだった場合に Submitを抑止できます。 関数内でエラーが発生するとSubmitされちゃうんですけどねw | ||||||||
|
投稿日時: 2007-12-28 16:33
すみません。今になって
このご指摘が理解できました。 実際にサンプルのコードを使ってpostさせて、post先で値を確認したのですが、 値が入っていないことを確認しました。 その後、末記人さんのコードを参考にして、こんな形のコードになりました。 正しいファイルパスを指定した場合: ・check()がtrueを返す&正しいパスなので、Submitがかかる 正しくないファイルパスを指定した場合: ・check()のところでエラーメッセージを出力する。 ・check()は一応falseを返しているが、IEの機能でSubmitは行われない といった感じで、期待通りの動作になるかなと思っています。
なぎさ。さん、末記人さん、ありがとうございました。 | ||||||||
|
投稿日時: 2007-12-29 00:11
こんばんは。
#すっかり出遅れた感が否めませんが・・・。 <input type="file" /> を <input type="file" onKeyDown="return false;" /> にしてしまえば、手動入力を防ぐことができます。 #NOTユーザビリティですが。 #ファイルパスのチェックが面倒であれば、これで逃げる手も(笑) _________________ 普通?常識?何ですかそりは。 日本語は難しい・・・。 |