使用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