[5] [[HTML]] の [CODE(HTMLe)[[[input]]]] 要素は、 [CODE(HTMLa)[[[type]]]]
属性が [DFN[[CODE(HTML)[file]]]] の時、[DFN[ファイル選択制御子]]となります。
[6] 仕様書:
- [[HTML 4]] ([[Web Forms 1.0]])
-- file select control
-- 17.4 The [CODE(HTMLe)[INPUT]] element
--[CITE[B.10.1 Security issues for forms]]
[7] 属性:
,属性名 ,属性値 ,既定値 ,説明 ,出典
,[CODE(HTMLa)[[[accept]]]] ,[CODE(SGML)[%[[ContentTypes]]]] , ,受入れ媒体型 ,[HTML 4]
,[CODE(HTMLa)[[[accesskey]]]] ,[CODE(SGML)[%[[Character]]]] , , ,[HTML 4]
,[CODE(HTMLa)[[[align]]]] , , ,配置 ,[HTML 4] 非推奨
,[CODE(HTMLa)[[[class]]]] , , ,[[級]] ,[HTML 4] %[[coreattrs]]
,[CODE(HTMLa)[[[dir]]]] , , ,[[書字方向]] ,[HTML 4] %[[i18n]]
,[CODE(HTMLa)[[[disabled]]]] ,(真偽値属性) ,(偽) ,無効 ,[HTML 4]
,[CODE(HTMLa)[[[id]]]] , , ,一意識別子 ,[HTML 4] %coreattrs
,[CODE(HTMLa)[[[lang]]]] , , ,[[自然言語]] ,[HTML 4] %i18n
,[CODE(HTMLa)[[[xml]]:lang]] , , ,自然言語 ,[XHTML 1]
,[CODE(HTMLa)[[[language]]]] , , ,スクリプト言語 ,[[WinIE 4]]+
,[CODE(HTMLa)[[[name]]]] , , ,制御子名 ,[HTML 4]
,[CODE(HTMLa)[[[onblur]]]] ,[CODE(SGML)[%[[Script]]]] , ,焦点を失した時 ,[HTML 4]
,[CODE(HTMLa)[[[onchange]]]] ,[CODE(SGML)[%[[Script]]]] , ,現在値変更時 ,[HTML 4]
,[CODE(HTMLa)[[[onclick]]]] , , , ,[HTML 4] %[[events]]
,[CODE(HTMLa)[[[ondblclick]]]] , , , ,[HTML 4] %events
,[CODE(HTMLa)[[[onfocus]]]] ,[CODE(SGML)[%[[Script]]]] , ,焦点を得た時 ,[HTML 4]
,[CODE(HTMLa)[[[onkeydown]]]] , , , ,[HTML 4] %events
,[CODE(HTMLa)[[[onkeypress]]]] , , , ,[HTML 4] %events
,[CODE(HTMLa)[[[onkeyup]]]] , , , ,[HTML 4] %events
,[CODE(HTMLa)[[[onmousedown]]]] , , , ,[HTML 4] %events
,[CODE(HTMLa)[[[onmousemove]]]] , , , ,[HTML 4] %events
,[CODE(HTMLa)[[[onmouseout]]]] , , , ,[HTML 4] %events
,[CODE(HTMLa)[[[onmouseover]]]] , , , ,[HTML 4] %events
,[CODE(HTMLa)[[[onmouseup]]]] , , , ,[HTML 4] %events
,[CODE(HTMLa)[[[onselect]]]] ,[CODE(SGML)[%[[Script]]]] , ,文選択時 ,[HTML 4]
,[CODE(HTMLa)[[[readonly]]]] ,(真偽値属性) ,(偽) ,読取専用 ,[HTML 4]
,[CODE(HTMLa)[[[style]]]] , , ,スタイル情報 ,[HTML 4] %coreattrs
,[CODE(HTMLa)[[[tabindex]]]] ,[CODE(SGML)[[[NUMBER]]]] , ,タブ順 ,[HTML 4]
,[CODE(HTMLa)[[[title]]]] , , ,注釈的題 ,[HTML 4] %coreattrs
,[CODE(HTMLa)[[[type]]]] ,'''[CODE(HTML)[file]]''' ,[CODE(HTML)[[[text]]]] ,制御子の種類 ,[HTML 4]
,[CODE(HTMLa)[[[value]]]] , , ,初期値 ,[HTML 4]
[[#comment]]
* 初期値・現在値
[8] [[UA]] は、 [CODE(HTMLa)[value]] 属性の値を初期ファイル名としても構いません。
[SRC[HTML 4 17.4.1]]
[[#comment]]
* ファイル選択
[17] '''ファイル・システム上にないファイル''':
[CODE(HTMLe)[input]] [CODE(HTMLa)[type]] [CODE(HTML)[file]]
によって作られるファイル選択制御子は、
必ずしも[[ファイル・システム]]に現在存在するファイルを選択しなければならないのではありません。
賢い利用者エージェントはその場で文書ファイルを作成したり、
絵を描いたり、録音したりする機能を提供しているかもしれません。
そうはいってもそのことは HTML 4 では明確になっていませんでした。
実際にそのような機能を実装している利用者エージェントがあるのかどうかは不明です。
しかし、 [CODE(HTMLe)[input]] [CODE(HTMLa)[type]]
を拡張して写真撮影や録音の機能を追加しようという提案
[SRC[[[device-upload]]]] に対し、 W3C HTML WG
は [CODE(HTMLe)[input]] [CODE(HTMLa)[type]] [CODE(HTML)[file]]
で十分対応できるという結論を下しています。
[[Web Forms 2.0]] はこの辺りの扱いも幾分明確化しようと試みています。
[18] '''複数ファイルの選択''':
[CODE(HTMLe)[input]] [CODE(HTMLa)[type]] [CODE(HTML)[file]]
によって作られるファイル選択制御子は、
複数のファイルを選択できます。このことは HTML 4
などの仕様上も明確であり、 [CODE(MIME)[[[multipart/form-data]]]]
による提出方法も規定されています。
しかし、実際には複数のファイルを選択できる利用者エージェントがあるのかどうかは不明です。
多くの利用者エージェントは高々1つしか選択できません。
また、[[フォーム処理エージェント]]もその状況を反映して複数ファイルが提出されることを想定していないものがほとんどと推定されます。
[[Web Forms 2.0]] はこの状況と互換性を保ちつつ複数ファイルを選択可能にしようと試みています。
[[#comment]]
* 提出
[10] 提出の時の挙動についてはフォームの[[提出]]の説明をご覧ください。
[[#comment]]
* 実装
[12] ''File Upload CGIで知らないと困ること''
現在となっては古い内容ですが、
ブラウザのファイル送信機能の実装には色々と問題があったことが分かります。
[13] [[NC4]] では、[[漢字コード]]の問題で、非 ASCII
文字を含むファイル名のファイルは選択できても送信できないことがありました。
[14]
[[WinIE]] で [[Internet Shortcut]] を選択すると、
shortcut ではなく、リンク先 URI の資源を取ってきて、その一時ファイルのファイル名が表示・送信されるようです。
Internet Shortcut でない [[Shortcut]] がリンク先のファイル名に直されるのと同様、
[[Common Dialog]] control の仕様のようです [WEAK[(普通の shortcut のリンク先ににするかどうかは common dialog 呼び出しの option で指定できますから、それと同じ option か、新設の別の option でこの機能を無効化できると思いますが、詳しくは [[MSDN]] でも見て調べてください)]]。
WinIE に限らず、 [[Mozilla]] や[[メモ帳]]などでも再現しますから、 Common Dialog Control に組み込まれた機能とみて間違いないでしょう。
聞くところによりますと、この機能が実装されているのは [[Windows Me]]
と [[Windows 2000]] 以降の [[Windows NT]] だそうです。
おそらく Common Dialog Control の版に依存しますから、 WinIE の版などにも左右されるかもしれません。
([[名無しさん]])
[[#comment]]
* 安全性
[11] ファイル選択制御子を使ってファイルを選択すると、
提出した時のそのファイルが送られることになります。
利用者は、本当に送信しても良いファイルであるのか、
送信しても良い相手なのか、十分に注意するべきです。
[3] 特に、 >>8 のように初期ファイル名を指定できるので、
利用者が十分な確認をせずにフォームを提出してしまうと、
意図せずにファイルを送信してしまうこととなり、危険です。
[15] HTML 4 仕様書は、利用者に明確に確認させずに
[ABBR[UA][利用者エージェント]]がファイルを送るべきではなく、
確認を取ることが期待されていると述べています。
[SRC[HTML 4 B.10.1]]
[ABBR[[[CSS]]][Cascading Style Sheets]] などで [CODE(HTMLe)[input]]
要素を非表示にすることもできますが、
それによって利用者が気づかぬうちにファイルが送られてしまうことが無いように
[ABBR[UA][利用者エージェント]] 実装者は注意しなければならないでしょう。
[16] [ABBR[HTML][Hypertext Markup Language]]
にはデータを転送する方法が用意されていません。
[ABBR[[[TLS]]]] を使うなど別途安全を確保する必要があります。
また、[[フォーム処理エージェント]]は[ABBR[[[うp]]][upload]]されたファイルを適切に扱うべきです
[SRC[HTML 4 B.10.1]]。
[[#comment]
* 他との関係
[9] [CODE(HTMLe)[[[form]]]] 要素の [CODE(HTMLa)[[[enctype]]]]
属性は、 [CODE(HTML)[file]] 制御子を使う時には
[CODE(MIME)[[[multipart/form-data]]]] とするべきです
[SRC[HTML 4 17.3]]。
[[#comment]]
* メモ
- [1] [CODE(HTML)[type=file]] なのに親 [CODE(HTMLe)[[[form]]]] が [CODE(HTML)[[[enctype]]="[CODE(MIME)[[[multipart/form-data]]]]"]] でない場合の動作ですが、 [[WinIE6]], [[Mozilla]] 1.4, [[Opera]] 7.20 で [CODE(MIME)[[[application/x-www-form-urlencoded]]]], [CODE(MIME)[[[text/plain]]]] (Opera は未対応) ともに、ファイル名が送られました。ファイル名未指定のときには空文字列が送られました。
- [2] 面白いことに、ファイル名は、 WinIE は[[完全経路名]], Opera は完全経路名を [CODE(char)["]] でくくったもの、 Mozilla は狭義の[[ファイル名]]でした。 (Opera の [CODE(MIME)[multipart/form-data]] との動作の違いに注意。)
- [4] >>2 の Opera の挙動はバグですよねぇ。そもそも >>1 の仮定自体が規格外ですから Opera を責めるつもりはまったくないですけど、引用符で囲むことに意味を見出せません。 Opera は既存ブラウザの互換性を幾分考えて設計されているのですから、わざわざ非互換にしたのだとしたら激しく謎です。