色々な入力をする為のボックス。form要素内で使用する(のが正しい)。
type属性によって、入力の種類(ボックスの形)が変わる。
| text | password |
| file [/2007-10-28] | |
| hidden | |
| button | submit |
| checkbox | radio |
一行の文字列を入力するのに使用する。
→JavaScriptでの扱い方
→複数行を扱うtextareaタグ
パスワードの入力に使用するので、入力した文字が表示されない。
ファイルタイプと同じく、valueに値をセットしても無視される。
ローカルのファイル名(パス名)の入力に使用する。
これを使う際には、formタグのエンコードタイプを指定し、“マルチパート/フォームデータ(multipart/form-data)”にする。→例
サブミットすると、ファイル名と共にファイルの内容がサーバーに転送される。→Java:サーバー側でファイルを受け取る方法
ファイルタイプでは、サーバー側でvalue属性に値を入れても画面(ブラウザー上で見たとき)には入れた値が反映されない。(JavaScriptで入れてもダメ)
つまり、サーバー側で入力値の精査を行って精査エラーになって画面を再表示しようと思っても、「ファイルのパスに関しては再表示できない」ということ。
これはセキュリティーの問題で、これが出来てしまうと危険だから。
仮に出来たとすると、HTMLのロード時にJavaScriptでローカルファイル名を指定してそのままsubmit()することにより、(クライアントの)ユーザーの意向を無視して、ローカルファイルの内容をサーバーに送ることが出来てしまう!
参考: @IT会議室のINPUT TYPE=FILEタグでの入力値保持について
ただ、外部からファイル名を入力することは(ちょっと面倒だが)可能。
→ファイル選択のテキストエリアへ入力する方法の概要 [2007-10-27]
→Javaでファイル選択のテキストエリアへ入力する方法 [2007-10-28]
ファイルタイプでは、accept="MIMEタイプ"という属性があるらしい。[2007-08-15]
これによってアップロードするファイルの種類を指定する意図らしいが、対応しているブラウザーは無いらしく、指定しても無意味。
「ファイルの選択」ダイアログでアップロードする拡張子を指定できると便利だと思う人がいっぱいいると思うんだけどなぁ。
IE(6SP2や7)では、ファイル名欄に変な値を入れると、JavaScriptエラーが発生することがある。[2007-09-20]
(IEの左下(ステータスバーの左端)に黄色いエラーマークと共に「ページでエラーが発生しました」と表示される。そのアイコンをダブルクリックするとエラーの詳細(「エラー:アクセスが拒否されました」)が見られる
。
これはどうやらIE6のSP2以降で起こるっぽい。IE6SP1ではエラーにならなかった…)
具体的には、以下のような条件で そのようなエラーが発生する。
この事象は、文字の種類やファイルの実在有無より、パスの形式に関わっている模様。不正な文字でも絶対パスでは発生せず、相対パス(に似た形)の場合に発生する。
→Microsoftの[IE]Input
type=file属性の入力フォームにてsubmitを行ってもWebサーバーから反応がない
| 実験意図 | 例 | JScriptエラー 発生有無 |
備考 |
|---|---|---|---|
| ドライブ名のみ | C: |
無 | Xがドライブとして割り当てられていなくても送信される。 |
| 変なドライブ | CC: |
JScriptエラー | |
| フルパス | C:\test.txt |
無 | 存在しないファイルでも送信される。 |
| ルート | \test.txt |
無 | |
| ファイル名のみ | test.txt |
JScriptエラー | |
| ネットワーク | \\server\test.txt |
無 | 存在しないサーバー・ファイルでも送信される。 |
| 特殊文字 | <|> |
JScriptエラー | 普通にファイル名の場合と同じ扱いっぽい。 |
C:<|> |
無 | ||
| 相対パス | .\test.txt |
JScriptエラー | |
| 途中が相対パス | C:\test\..\test.txt |
無 | |
| ダブルクォーテーション | "C:\test.txt" |
JScriptエラー | |
C:"test.txt" |
無 |
※送信される(JavaScriptエラーが発生しない)場合、存在しないファイル(や存在していてもディレクトリ)であれば、サーバーで受け取るのは0バイトのデータ。
このJavaScriptエラーはsubmit()関数で発生するので、そのエラーをcatchしてやればエラー処理は出来る (ステータスバーに警告が出ないようになる)。
<script>
function submit_func()
{
try {
document.f.submit();
} catch(e) {
// var str;
// for(var key in e) {
// str += key + "=["+ e[key] + "]\n";
// }
// alert(str);
if (e.number == -2147024891) {
alert(e.message); //「アクセスが拒否されました。」
}
}
}
</script>
チェックボックス。