使用javascript获取’File’对象的内容类型

我有两个文件具有相同的扩展名如下:

1) test_audio_file.mp4 (仅包含音频内容)

2) test_video_file.mp4 (包含音频和video内容)

上传文件后,我正在创建上传文件的File对象。

我想检查File对象的内容类型。 即第一个文件的audio/mp4和第二个文件的video/mp4

当我使用file_object.type方法打印文件类型时,我在两种情况下都获得了video/mp4

我的假设是我将获得第一个文件的audio/mp4和第二个文件的video/mp4

我在这里放一行代码:

 loadFile: function(file) { console.log(file.type); }; 

是否有任何方法或方法来获取第一个文件的内容类型audio和第二个文件的video

任何想法都会很棒。 谢谢!

浏览器通常会通过文件扩展名采用mime类型,在这两种情况下都是mp4。

当然,您可以检查文件的二进制内容。

假设你已经在ArrayBuffer加载了文件,你可以先为它创建一个灵活的视图(不能使用Uint32Array,因为缓冲区的长度必须是4字节对齐,而文件的情况并不总是如此,DataView会做大的事情-endian to little-endian交换你):

 var view = new DataView(buffer); // buffer = ArrayBuffer 

更新 :删除“不需要”首先检查/用于我建议在任何情况下使用的盒子大小。更多细节添加。)

然后,检查primefaces ( MP4文件格式操作“primefaces”和“盒子”而不是“块”,就像许多其他类似的格式一样)“ ftyp ”(0x66747970),字节4-8(big-endian):

 if (view.getUint32(4) === 0x66747970) { // = "ftyp" // ok, so far so good.. } 

现在检查这是什么类型的MP4:

 if (view.getUint32(8) === 0x64617368) { // = "dash" // audio } else if (view.getUint32(8) === 0x6D703432) { // = "mp42" // audio + video } 

我们现在可以为音频创建一个具有适当mime类型集的对象URL:

 var blob = new Blob([buffer], {type: "audio/mp4"}); var url = URL.createObjectURL(blob); // src for video/audio element 

请注意 ,还有许多其他类型需要考虑(使用hex编辑器来检查所需文件的实际值),您可能希望使用带有indexOf()数组来检查多个可能的值:

 var videoTypes = [0x6D703432, 0x69736F6D, ...]; // mp42, isom, ... ... var type = view.getUint32(8); if (videoTypes.indexOf(type) > -1) { /* ok! */ } 

作为后备,你可以假设video/mp4为未知的标题和类型,创建一个video/mp4为mime类型的blob,让浏览器从那里处理文件。

有关偏移和框长度的详细信息,请参阅上面的链接。

工作演示

以下演示仅限于检查给定示例文件的类型。 您当然需要扩展其他MP4类型(类型字段)来检查实际应用程序,例如使用一个音频类型数组,一个用于video等。

加载其中一个文件以进行分析。

 var inp = document.querySelector("input"); inp.onchange = function(e) { var reader = new FileReader(); reader.onload = analyze; reader.readAsArrayBuffer(e.target.files[0]); }; function analyze(e) { var buffer = e.target.result, view = new DataView(buffer), blob, url; // check file type if (view.getUint32(4) !== 0x66747970) { // = "ftyp" alert("Not MP4 file!"); return } // check if audio or audio+video if (view.getUint32(8) === 0x64617368) { // = "dash" alert("Audio\n(See console for example url)"); blob = new Blob([buffer], {type: "audio/mp4"}); } else if (view.getUint32(8) === 0x6D703432 || // = "mp42" view.getUint32(8) === 0x69736F6D) { // = "isom" alert("Video+Audio\n(See console for example url)"); blob = new Blob([buffer], {type: "video/mp4"}); } else { // assume video/mp4 alert("Unsupported:\n0x" + (view.getUint32(8)).toString(16)); blob = new Blob([buffer], {type: "video/mp4"}); } // convert blob to an URL that can be used with a video/audio element url = (URL || webkitURL).createObjectURL(blob); console.log("Copy and paste this into a tab, wo/quotes:", url); } 
 Pick a MP4 file:  

你可以试试

 input.file.type.match('video.*') 

这里将详细介绍https://stackoverflow.com/a/7412549/3327294