2013-02-10 64 views
2

中安全地使用擴展名列表(不是mimetypes)所以我想限制用戶上傳到特定文件擴展名列表的選項。 這純粹是爲了讓用戶更容易,我也已經限制了服務器上的文件類型上傳。我可以在輸入接受屬性

我有一個擴展名列表,但不是一個MIME類型列表。由於接受的擴展可能會發生變化,並且我沒有看到任何完全可靠的方式來動態計算他們的MIME類型(並且寧願避免這種情況);我只想將擴展插入到<input type="file">元素的「接受」屬性中。

我已經注意到這項工作完全符合Chrome瀏覽器的要求,但不是FF或IE10(在這些瀏覽器中,它似乎只是回退到所有文件)。

我意識到這不是標準的一部分,但有什麼方法可以接受擴展,而不是接受'屬性是(現代瀏覽器)跨瀏覽器友好mimetypes。我使用的測試案例<input type="file" accept=".doc,.docx,.bad" />

如果這不可行,那麼最好的方法是什麼?注意:我沒有garuntee我的服務器註冊表將包含我使用的擴展的所有mimetypes,並且因爲這個列表可能很長,所以手動保持列表是最新的mimetypes是不切實際的(並且將是我的最後手段) 。

+0

根據Mozilla的[文檔](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/Input#attr-accept),它應該可以在Firefox上使用。 – 2014-11-24 09:53:14

回答

3

不,它不安全。 HTML 4.01 accept屬性被定義爲使得該值是逗號分隔的媒體類型列表。即使這一點最近已經實施(例如,在IE 9中不支持)。

在HTML5草案中,該屬性最近已被擴展以允許擴展,並且HTML5 CR描述file input甚至建議:「鼓勵作者在查找時指定任何MIME類型和任何相應的擴展名以特定格式提供數據「。然而,這尚未廣泛實施。

它在概念上也很雜亂。媒體類型的設計旨在成爲指定文件和其他數據類型的標準化和互操作性方式。文件名擴展只是文件名的一部分,在某些系統中以特殊方式處理,沒有標準,超出了一些不太一致的常見做法。把這兩個要求混爲一談,儘管這背後有一些實際的原因。

在任何情況下,在文件輸入,文件名擴展和媒體類型之間的映射是由瀏覽器用戶的計算機的底層操作系統和文件系統一起執行;服務器不參與。

使用File API,您可以在支持它的瀏覽器(例如Firefox)中檢出選定文件的文件名,並選取文件擴展名並通知用戶是否選中文件將不被接受。但是這會在選擇之後發生,而不會影響文件選擇小部件,並且您只能要求用戶更改選擇。

+0

我在看包括所有的MIME類型,但注意到一些文件類型可能有5個MIME類型與一個擴展相關聯,我真的不想讓它們中的每一個都匹配一個工作嗎?或者是最安全的?感謝您提供豐富的答案。 – 2013-02-11 22:28:57