[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 [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]] * 提出 [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 のように初期ファイル名を指定できるので、 利用者が十分な確認をせずにフォームを提出してしまうと、 意図せずにファイルを送信してしまうこととなり、危険です。 [[#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 は既存ブラウザの互換性を幾分考えて設計されているのですから、わざわざ非互換にしたのだとしたら激しく謎です。