/
686.txt
285 lines (219 loc) · 16 KB
/
686.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
[18] [DFN[[RUBYB[[[ダウンロード]]]@en[download]]]]は、
[[クライアント]]が[[サーバー]]から受信する操作をいいます。
多くの場合、[[クライアント]]側の[[ファイルシステム]]等の[[データベース]]に保存する操作までを含めて[[ダウンロード]]といいます。
;; [19] 受信したデータをその場で表示したり、[[ストリーミング]]再生したりする操作も[[ネットワーク]]からのデータ受信のみに着目すれば[[ダウンロード]]ですが、
[[利用者]]が意図的に[[ファイル]]として保存しないため、
[[利用者]]の視点では[[ダウンロード]]ではありません。
* 仕様書
[REFS[
- [28] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2016-04-09 09:15:24 +09:00]] 版) <https://html.spec.whatwg.org/#attr-hyperlink-download>
- [40] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2016-04-09 09:15:24 +09:00]] 版) <https://html.spec.whatwg.org/#as-a-download>
]REFS]
* プロトコル
[20] [[HTTP]] や [[FTP]] が[[ファイル]]転送に使われます。
[21] 次のような[[プロトコル要素]]や[[アルゴリズム]]があります。
[FIG(middle list)[
- [CODE(DOMa)@en[[[download]]]] [[属性]] ([[HTML]])
- [[ハイパーリンクのダウンロード]]
- [CODE(HTTP)@en[[[Content-Disposition:]] [[attachment]]]]
- [[証明書ダウンロード]]
- [[navigate]]
]FIG]
* 保存
[13] 多くの [[Webブラウザー]]は、 [[navigate]] 時の[[ダウンロード]]の他に、
表示中の[[文書]]の保存や、[[画像]]、[[媒体]]等の保存の機能を提供しています。
[14] [[文書]]の保存は、元の [[HTML]] の保存だけでなく、表示中の[[文書]]の直列化や、
表示中の[[文書]]とそれに埋め込まれている[[画像]]や [[CSS]] 等の一式の保存、
[[平文]]化して保存といった機能が提供されていることがあります。
[15] 「Web ページ、完全」で保存すると、 [[Chrome]] と [[Firefox]]
の場合は[[拡張子]]以外のファイル名 +
[CODE[_files]]、 [[IE]] の場合は拡張子以外のファイル名 + [CODE[.files]]
という名前の[[フォルダー]]が作られ、その中に[[画像]]等のファイルが保存されます。
;; [16] [[Windows]] の[[エクスプローラー]]は本体ファイルを削除するとこの[[フォルダー]]も同時に削除します。
[17] [[IE]] は [[MHT]] 形式での保存にも対応しています。この形式では[[画像]]等もまとめて1つのファイルになります。
* ダウンロード
[39] [[fetch]] の結果の[VAR[応答]]を[DFN[[RUBYB[[[ダウンロード]]として]@en[as a download]]]]処理するとは、
[VAR[起源]]と[VAR[提案ファイル名]]や[VAR[イベント]]について、
次のようにする[SHOULD[べきです]] [SRC[>>40]]。
[FIG(steps)[
= [41] [VAR[応答]]が失敗なら、
== [42] [[利用者]]に問題を報告します。
= [43] それ以外なら、
== [44] [[利用者]]に対して、[VAR[応答]]を保存する手段を提供します。
]FIG]
[45] 一般的な[[Webブラウザー]]は、 [[fetch]] 開始直後、または[[応答ヘッダー]]受信時点で、
[[利用者]]に[[ファイル名]]を尋ねる[[ダイアログ]]を表示します。
あるいは実装と設定によっては、[[ダイアログ]]なしで[[ダウンロード]]用の[[ディレクトリー]]に自動的に保存します。
[46] [[利用者エージェント]]は、[[ファイル名]]が必要な場合、
次のように決定する[SHOULD[べきです]]。
この手順は信頼できないサイトからの[[ダウンロード]]の危険性を緩和しようとするものですから、
[[利用者エージェント]]はこれに従うことが[RUBYB[強く推奨]@en[strongly urged]]されています。
[SRC[>>40]]
[FIG(steps)[
= [47] [VAR[ファイル名]]を、 [[null]] に設定します。
= [68] [VAR[CD]] を、[VAR[応答]]の[F[ヘッダーリスト]]に [CODE(HTTP)@en[Content-Disposition]]
[[ヘッダー]]に設定します。
= [69] [VAR[CD]] が [[null]] でなければ、
== [67] [VAR[配置型]]を [VAR[CD]] の[F[配置型]]に設定します。
== [60] [VAR[HTTPファイル名]]を、 [VAR[CD]] の [CODE(MIME)@en[filename]] の値に設定します。
= [70] それ以外なら、
== [71] [VAR[配置型]]を、 [[null]] に設定します。
== [72] [VAR[HTTPファイル名]]を、 [[null]] に設定します。
= [48] [VAR[配置型]]が [CODE(MIME)@en[attachment]] で、
[VAR[HTTPファイル名]]が [[null]] でなければ、
== [49] [VAR[ファイル名]]を、[VAR[HTTPファイル名]]に設定します。
= [50] それ以外なら、
== [55] [VAR[起源]]が [[null]] なら、
=== [56] [VAR[信頼された操作]]を、[[真]]に設定します。
== [57] それ以外なら、
=== [52] [VAR[応答]]の[F[URL][応答のURL]]の[F[scheme][URL scheme]]が [CODE(URI)@en[data][data:]]
なら、
@@ かつ[[リダイレクト]]以外の場合?
==== [53] [VAR[資源の起源]]を、[VAR[起源]]に設定します。
=== [54] それ以外なら、
==== [51] [VAR[資源の起源]]を、[VAR[応答]]の[F[URL][応答のURL]]の[F[起源][URLの起源]]に設定します。
=== [58] [VAR[信頼された操作]]を、
[VAR[起源]]と[VAR[資源の起源]]が[[同じ起源]]かどうかに設定します。
== [59] [VAR[信頼された操作]]が[[真]]で、[VAR[HTTPファイル名]]が [[null]]
でなければ、
=== [61] [VAR[ファイル名]]を、[VAR[HTTPファイル名]]に設定します。
== [62] それ以外なら、
=== [64] [VAR[信頼された操作]]が[[真]]か、[VAR[配置型]]が [CODE(MIME)@en[attachment]] なら、
==== [73] [VAR[ファイル名]]を、[VAR[提案ファイル名]]に設定します。
=== [63] [VAR[ファイル名]]が [[null]] なら、
==== [65] [VAR[信頼された操作]]が[[真]]か、[VAR[イベント]]が[[利用者]]の[[ダウンロード]]の指示があったことを示していれば、
===== [66] [VAR[ファイル名]]を、[VAR[応答]]の[F[URL][応答のURL]]から[[利用者エージェント]]依存の方法で決定した値に設定します。
==== [74] それ以外なら、
===== [75] [[利用者エージェント]]依存の方法で、[[利用者]]を保護するための手段を講じます。
[[著者]]が異なる[[起源]]の[[資源]]を[[利用者]]に[[ダウンロード]]させようとしていますが、
[[著者]]に悪意があって[[利用者]]を騙そうとしている場合もあります。
ここで停止して構いません。
===== [76] [VAR[ファイル名]]を、[[利用者エージェント]]依存の方法で決定した値に設定します。
([[利用者]]に決めさせたものでも構いません。)
= [78] [[利用者]]に[[ダイアログ]]を表示するなどして、
[VAR[ファイル名]]を編集させて構いません。
= [79] [[ファイルシステム]]の制約に合わせて、[VAR[ファイル名]]を調整します。
= [80] [[プラットフォーム][プラットフォーム (Web)]]が[[拡張子]]を使ってファイルの種別を判断するなら、
== [81] [VAR[資源の型]]を、 [VAR[応答]]の [F[Content-Typeメタデータ]]に設定します。
== [82] [VAR[名前の型]]を、[VAR[ファイル名]]の[F[拡張子]]から判断した型に設定します。
== [83] [VAR[資源の型]]と[VAR[名前の型]]が同じか、
[VAR[名前の型]]が[[利用者]]の意図に沿うもの (例えば[VAR[ファイル名]]の一部として[[利用者]]が明示的に指定したもの) かのどちらでもないなら、
=== [84] [VAR[資源の型]]の[[拡張子]]がわかるなら、
==== [85] [VAR[ファイル名]]を変更して、[VAR[資源の型]]の[[拡張子]]とします。
=== [86] それ以外で、[VAR[名前の型]]が危険なもの
([[実行可能ファイル]]、[[シェルスクリプト]]など) なら、
==== [87] [VAR[ファイル名]]に安全とわかっている[[拡張子]] ([CODE[.txt]] など)
を付加して構いません。
= [88] [VAR[ファイル名]]を返します。
]FIG]
[89] 保存先の決定には、[[著者]]側から提供された情報 ([VAR[HTTPファイル名]]や[VAR[提案ファイル名]]や[VAR[応答]]の[F[URL][応答のURL]]) を使う[SHOULD[べきではありません]]
[SRC[>>40]]。
[77] [[ダウンロード]]の処理は、
[[ハイパーリンクのダウンロード]]により、または[[navigate]]により、
呼び出されます。
[90] [[Webブラウザー]]によっては、[[利用者]]を保護するため、
[[ダウンロード]]したのが[[ウイルス]]その他危険な[[ファイル]]でないかを検査します。
* ヘルパーアプリケーション
[37] [[navigate]]、[[ヘルパーアプリケーション]]も参照。
* [CODE(HTMLe)@en[a]] 要素 [CODE(HTMLa)@en[download]] 属性
[29] [CODE(HTMLe)@en[a]] [[要素]]の [DFN[[CODE(HTMLa)@en[download]]]]
[[属性]]は、当該[[ハイパーリンク]]が[[ダウンロード]]のためのものであることを示します。
** 属性値
[30] 本[[属性]]を指定しないと、[[ダウンロード]]ではなく、
通常の[[ハイパーリンクをたどる]]操作が想定される既定の動作であることを表します。
[31] 本[[属性]]を指定すると、当該[[ハイパーリンク]]が[[資源]]の[[ダウンロード]]のために使われることを[[著者]]が意図していることを表します
[SRC[>>28]]。
[32] 本[[属性]]に値を指定すると、[[ダウンロード]]した[[資源]]を手元の[[ファイルシステム]]に保存する際に[[名札]]として使うべき[[ファイル名]]の既定値として[[著者]]が推奨する値を表します
[SRC[>>28]]。
[33] 値には、制約はありません [SRC[>>28]]。
しかし[[ファイルシステム]]や[[プラットフォーム]]の制約、
あるいは[[利用者]]の指示によって[[ファイル名]]は適宜修正されるものですから、
[[著者]]が指定した値がそのまま使われるわけではありません。
[[拡張子]]の有無なども特に規定されていません。
([[プラットフォーム]]に依存するので、[[利用者エージェント]]が[[利用者]]を適当に誘導するべき事項でしょう。)
[38]
[[ダウンロード]]して保存する先の[[ディレクトリー]] ([[フォルダー]])
を指定する方法はありません。
[[ディレクトリー]]の指定があっても、[[利用者エージェント]]は無視する[SHOULD[べき]]とされています。
** 処理
[34] [[ハイパーリンクのダウンロード]]を参照。
[35] 本[[属性]]は、[[ハイパーリンク]]の既定の動作を指定するものです。
[[利用者]]や[[利用者エージェント]]に[[ダウンロード]]を強制するものではありません。
[[文脈メニュー]]などを通して[[利用者]]が直接指示した場合は、
[[ダウンロード]]せずに[[ハイパーリンクをたどる]]こととなるかもしれません。
* 歴史
[36] [CODE(HTMLa)@en[download]] [[属性]]は、需要を反映して、
[[HTML5]] で追加されました。
[1] [CITE@en[HTML5 Tracker]]
([TIME[2011-07-22 16:15:06 +09:00]] 版)
<http://html5.org/tools/web-apps-tracker?from=6317&to=6318>
[2] [CITE[''''''[''''''whatwg'''''']'''''' Forcing a download]]
( ([TIME[2011-07-22 23:58:54 +09:00]] 版))
<http://lists.whatwg.org/htdig.cgi/whatwg-whatwg.org/2011-July/032601.html>
[3] [CITE[''''''[''''''whatwg'''''']'''''' <a download> feedback]]
( ([TIME[2012-02-16 08:22:31 +09:00]] 版))
<http://lists.whatwg.org/htdig.cgi/whatwg-whatwg.org/2012-February/034880.html>
[4] [CITE['''['''whatwg''']''' <a download> feedback]]
([TIME[2012-06-08 11:28:51 +09:00]] 版)
<http://lists.whatwg.org/pipermail/whatwg-whatwg.org/2012-June/036320.html>
[5] [CITE[WWW-Talk Jan-Mar 1993: binary file access via Mosaic]]
( ([TIME[2013-03-09 04:06:44 +09:00]] 版))
<http://1997.webhistory.org/www.lists/www-talk.1993q1/0258.html>
[6] [CITE@en[676619 – Implement proposed download attribute]]
( ([TIME[2013-03-18 08:55:15 +09:00]] 版))
<https://bugzilla.mozilla.org/show_bug.cgi?id=676619>
[7] [CITE@en[Web Applications 1.0 r7836 Fix <area> to match <a> in terms of security checking. Also, some editorial fixes.]]
( ([TIME[2013-04-16 04:11:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=7835&to=7836>
[8] [CITE[''''''[''''''whatwg'''''']'''''' Priority between <a download> and content-disposition]]
( ([TIME[2013-08-13 21:25:48 +09:00]] 版))
<http://lists.whatwg.org/pipermail/whatwg-whatwg.org/2013-August/040445.html>
[9] [CITE[Add download context per https://www.w3.org/Bugs/Public/show_bug.cgi?id=... · 69dfdc3 · whatwg/fetch]]
( ([TIME[2014-05-20 09:03:48 +09:00]] 版))
<https://github.com/whatwg/fetch/commit/69dfdc385ff40d48c06fede66b28a6aedbc848b0>
[FIG(quote)[
[FIGCAPTION[
[10] [CITE@en[1030660 – Is ClearBogusContentEncodingIfNeeded() needed?]]
([TIME[2015-03-06 13:52:40 +09:00]] 版)
<https://bugzilla.mozilla.org/show_bug.cgi?id=1030660>
]FIGCAPTION]
> Note that specifically for the save-to-file behavior what we actually do is completely ignore the Content-Type when deciding whether to decode. We just compare the URI filename extension, if any, to the Content-Encoding. If the Content-Encoding matches the filename extension, we don't undo the content encoding; otherwise we undo it.
]FIG]
[11] [CITE@en[184971 – display MIME type of the server in download dialog and not the mime-type returned by windows registry]]
([TIME[2015-04-11 22:35:21 +09:00]] 版)
<https://bugzilla.mozilla.org/show_bug.cgi?id=184971>
* 実装
[12] 最近の [[Webブラウザー]]には、[[ダウンロード]]したファイルのセキュリティー検査を自動的に行うものもあります。
[FIG(quote)[
[FIGCAPTION[
[22] [CITE[Web Security Context: User Interface Guidelines]]
([TIME[2010-08-04 20:09:50 +09:00]] 版)
<http://www.w3.org/TR/wsc-ui/#robustness-software-install>
]FIGCAPTION]
> Web user agents MUST NOT expose programming interfaces which permit installation of software without a user intervention.
> User agents MUST inform the user and request consent when the user agent is attempting to install software outside of the agent environment as a result of web content. The interaction used MUST follow the requirements in 6.4.2 Warning/Caution Messages . User agents SHOULD NOT provide features which can be used by web content to install software outside of the agent environment without the user's consent.
]FIG]
[23] [CITE@en[Integrate Fetch into HTML · whatwg/html@7c5555a]]
([TIME[2015-09-18 18:48:38 +09:00]] 版)
<https://github.com/whatwg/html/commit/7c5555a16f2920c02244c10756bb2f1a11e87a22>
[24] [CITE@en[MIME Type Detection in Windows Internet Explorer (Windows)]]
([TIME[2015-09-26 02:04:52 +09:00]] 版)
<https://msdn.microsoft.com/en-us/library/ms775147(v=vs.85).aspx>
[25] [CITE@en[Clarify the following/downloading hyperlink algorithms · whatwg/html@47e4aa0]]
([TIME[2015-11-05 17:14:39 +09:00]] 版)
<https://github.com/whatwg/html/commit/47e4aa05825df966848ca2c7773794576a130b88>
[FIG(quote)[
[FIGCAPTION[
[26] [CITE[IE9以降でダウンロード時file.exeがfile_exeにリネームされる件対処 - Qiita]]
([TIME[2016-01-08 11:52:02 +09:00]] 版)
<https://qiita.com/tukiyo3/items/dfcecb145a101addd2a1>
]FIGCAPTION]
> 「暗号化されたページをディスクに保存しない」のチェックを外す。
> OS再起動
]FIG]
[27] [CITE@en[URLs are parsed and produce records · whatwg/html@30bc255]]
([TIME[2016-02-14 22:58:30 +09:00]] 版)
<https://github.com/whatwg/html/commit/30bc2557105ad62881ec9670f253febbc9761b44>
[91] [CITE@en[Issue 610284 - chromium - Regression: 'Download as PDF' option is not working on 'www.chromium.org/Home'. - Monorail]]
( ([TIME[2016-05-15 11:32:15 +09:00]]))
<https://bugs.chromium.org/p/chromium/issues/detail?id=610284>