Javascript 如何检查文件是否与其扩展名的类型相同?

Javascript 如何检查文件是否与其扩展名的类型相同?,javascript,ajax,file,file-type,Javascript,Ajax,File,File Type,我想构建检查文件类型的Javascript代码。在我正在创建的web应用程序中,允许用户上载文档文件viz,doc,xls,ppt,docx,xlsx,pptx,txt,rar,zip,,jpg,png,gif,jpeg,odt,但不允许使用其他文件。我不能只检查文件名中的扩展名。用户可以更改它 我试着检查内容类型,但每次都会改变。欢迎提出建议 除非您能够真正解析内容,并通过结果判断文件是否属于某种类型,否则我看不到使用纯JS实现这一点的好方法。您可能需要考虑暂时将文件上载到服务器,然后在服务器

我想构建检查文件类型的Javascript代码。在我正在创建的web应用程序中,允许用户上载文档文件
viz
doc
xls
ppt
docx
xlsx
pptx
txt
rar
zip
jpg
png
gif
jpeg
odt
,但不允许使用其他文件。我不能只检查文件名中的扩展名。用户可以更改它


我试着检查内容类型,但每次都会改变。欢迎提出建议

除非您能够真正解析内容,并通过结果判断文件是否属于某种类型,否则我看不到使用纯JS实现这一点的好方法。您可能需要考虑暂时将文件上载到服务器,然后在服务器上执行检查。unix文件命令是一个非常有用的工具。它不依赖于文件扩展名,而是使用文件内容来分析文件类型。

除非您能够真正解析内容,并通过结果判断文件是否属于某一类型,否则我看不到使用纯JS进行分析的好方法。您可能需要考虑暂时将文件上载到服务器,然后在服务器上执行检查。unix文件命令是一个非常有用的工具。它不依赖于文件扩展名,而是使用文件内容来分析文件类型。

除非您能够真正解析内容,并通过结果判断文件是否属于某一类型,否则我看不到使用纯JS进行分析的好方法。您可能需要考虑暂时将文件上载到服务器,然后在服务器上执行检查。unix文件命令是一个非常有用的工具。它不依赖于文件扩展名,而是使用文件内容来分析文件类型。

除非您能够真正解析内容,并通过结果判断文件是否属于某一类型,否则我看不到使用纯JS进行分析的好方法。您可能需要考虑暂时将文件上载到服务器,然后在服务器上执行检查。unix文件命令是一个非常有用的工具。它不依赖于文件扩展名,而是使用文件内容来分析文件类型。

在“现代”浏览器(IE10+、Firefox 4+、Chrome 7+、Safari 6.0.2+等)中,您可以使用
文件
/
文件阅读器
API读取文件内容并在客户端对其进行解析。例如(例如,非生产代码):

var fileInput=/*您的元素*/
fileInput.addEventListener(“更改”,函数(e){
var file=e.currentTarget.files[0];
var reader=new FileReader();
reader.onload=文件加载;
reader.readAsArrayBuffer(文件);
});
函数文件加载(e)
{
var arrayBuffer=e.currentTarget.result;
//32表示我们只需要查看缓冲区的前32个字节。
//如果我们不指定长度,我们将得到整个缓冲区。
var bytes=newuint8array(arrayBuffer,0,32);
//现在,我们可以检查内容,与我们需要的任何文件签名进行比较
//例如:
如果(字节[0]==0x50&&
字节[1]==0x4b&&
字节[2]==0x03&&
字节[3]==0x04)
{
//这很可能是docx、xlsx、pptx或其他zip文件。
}
}

但是,请注意,例如zip不必以50 4b 03 04开头。因此,除非您花费相当多的时间研究不同的文件签名(或者找到一些已经这样做了的库),否则您可能会拒绝实际有效的文件。当然,也有可能会出现误报

不过,在这种情况下,误报没有多大关系,因为这只是一种用户友好的措施,用于检查用户是否正在上载将被服务器拒绝的文件。服务器应始终验证最终发送的内容

当然,读取整个文件以查看前几个字节也不是很有效。:-)查看Ray Nicholus对此的评论。

在“现代”浏览器(IE10+、Firefox 4+、Chrome 7+、Safari 6.0.2+等)中,您可以使用
文件
/
文件阅读器
API读取文件内容并在客户端解析。例如(例如,非生产代码):

var fileInput=/*您的元素*/
fileInput.addEventListener(“更改”,函数(e){
var file=e.currentTarget.files[0];
var reader=new FileReader();
reader.onload=文件加载;
reader.readAsArrayBuffer(文件);
});
函数文件加载(e)
{
var arrayBuffer=e.currentTarget.result;
//32表示我们只需要查看缓冲区的前32个字节。
//如果我们不指定长度,我们将得到整个缓冲区。
var bytes=newuint8array(arrayBuffer,0,32);
//现在,我们可以检查内容,与我们需要的任何文件签名进行比较
//例如:
如果(字节[0]==0x50&&
字节[1]==0x4b&&
字节[2]==0x03&&
字节[3]==0x04)
{
//这很可能是docx、xlsx、pptx或其他zip文件。
}
}

但是,请注意,例如zip不必以50 4b 03 04开头。因此,除非您花费相当多的时间研究不同的文件签名(或者找到一些已经这样做了的库),否则您可能会拒绝实际有效的文件。当然,也有可能会出现误报

不过,在这种情况下,误报没有多大关系,因为这只是一种用户友好的措施,用于检查用户是否正在上载将被服务器拒绝的文件。服务器应始终验证最终发送的内容

当然,读取整个文件以查看前几个字节也不是很有效。:-)请看雷·尼古拉斯对此的评论<