2012-08-02 49 views
2

如何在使用JavaScript上传之前验证文件的内容类型? 我不是要求扩展验证。我想验证pdf,纯文本和MS word文件。Javascript - 上传文件内容类型验证

我正在使用django forms.ModelForm将文件上传部件传递给html。我无法在服务器端实现这一点。这里是一个问题,

Django - Uploaded file type validation

+0

你问在客户端发送到服务器之前,如何识别客户端上的文件类型? – 2012-08-02 08:26:27

+0

是的,但我知道扩展验证。 – Babu 2012-08-02 08:41:43

回答

2

也许但它不会给你任何形式的安全,因为攻击者可以使用其他方式上传文件,从而绕过你的验证。

要使用扩展名检查文件类型(这是非常不安全的,因为它很容易操纵它),您可以使用JavaScript。看到这样的问题:How do I Validate the File Type of a File Upload?

[编辑]一些googling后,我发现,input元件具有需要的mime类型模式的列表的属性accept。不幸的是,大多数浏览器忽略它(或仅用它来调整文件选择对话框)。看到这个问题:File input 'accept' attribute - is it useful?

[编辑2]眼下,似乎文件API(见“Using files from web applications”)是你的它,你真的不希望使用的文件扩展名唯一途径。每个File实例都有一个type属性,其中包含MIME类型。

但是,此API正在进行中,因此无法在任何地方使用。并且不能保证你会得到一个MIME类型(该属性可以是"")。

所以我建议这种方法:试试File API。如果它不可用或type属性为空,请使用文件扩展名。

+0

假设,像所有客户端验证一样,目的不是安全的,而是为了保存用户上传(可能是大文件)的唯一目的,拒绝它。 – Quentin 2012-08-02 08:28:34

+1

该问题明确拒绝文件扩展名检查。 – Quentin 2012-08-02 08:28:52

+0

IIRC,accept属性的实现通常基于文件扩展名。 – Quentin 2012-08-02 08:43:19

2

从理论上讲,你可以使用File API读取这些文件。

然后,您需要在JavaScript中为您关心的文件格式编写解析器,以检查它们是否匹配。

+0

+1,因为当前IE不支持这种情况。 – Babu 2012-08-02 08:41:00

+0

注意:您不必解析文件;如果你有一个File对象,你可以阅读它的'type'属性:https://developer.mozilla.org/en/Using_files_from_web_applications/也就是说,File API是HTML 5并且正在进行中。 – 2012-08-02 08:48:04

+0

@AaronDigulla - 这需要相信浏览器才能正确确定文件类型。我期望浏览器问底层操作系统和Windows(至少)使用文件扩展名。 – Quentin 2012-08-02 09:35:34