我可以安全地在输入accept属性中使用扩展名列表(而不是mimetypes)

时间:2013-02-10 21:30:54

标签: html html5 file-upload

所以我想限制用户上传到特定文件扩展名列表的选项。 这纯粹是为了让用户更容易,我已经限制了服务器上的文件类型上传。

我有一个扩展列表,但没有mime类型列表。由于接受的扩展可能会发生变化,我没有看到任何完全可靠的动态计算其mime类型的方法(宁愿避免这种情况);我想将扩展名添加到<input type="file">元素的“accept”属性中。

我注意到这与Chrome上的预期完全相同,但不适用于FF或IE10(在这些浏览器中,它似乎只是回退到所有文件)。

我意识到这不是标准的一部分,但有没有办法接受扩展而不是'accept'属性中的mimetypes,它是(现代浏览器)跨浏览器友好的。我的测试用例使用<input type="file" accept=".doc,.docx,.bad" />

如果无法做到这一点,最好的方法是什么?注意:我没有我的服务器注册表将包含我使用的扩展的所有mimetypes,并且因为这个列表可能很长,所以手动保持最新的mimetypes列表是相当不切实际的(并且将是我的最后手段)

1 个答案:

答案 0 :(得分:3)

不,这不安全。定义HTML 4.01 accept属性,以便该值是以逗号分隔的媒体类型列表。甚至这已经在最近实施(例如,在IE 9中没有支持)。

在HTML5草稿中,该属性(最近)已经扩展为允许扩展,file input的HTML5 CR描述甚至建议:“鼓励作者同时指定任何MIME类型和任何相应的扩展名在寻找特定格式的数据时。“但是,这还没有得到广泛实施。

它在概念上也非常混乱。媒体类型在设计上意味着是指定文件类型和其他数据的标准化和互操作方式。文件扩展名只是在某些系统中以特殊方式处理的文件名的一部分,没有标准,超出了一些不太一致的常见做法。虽然这背后有一些实际的原因,但是把这两个电话混合起来会有麻烦。

在任何情况下,在文件输入中,文件扩展名和媒体类型之间的映射由浏览器用户的计算机的基础操作和文件系统一起执行;服务器没有参与。

使用File API,您可以在支持它的浏览器(例如Firefox)上查看所选文件的文件名并选取文件扩展名并通知用户如果所选文件不被接受。但是这会在选择之后发生,而不会影响文件选择小部件,并且您只能要求用户更改选择。