84669 person learning
152542 person learning
20005 person learning
5487 person learning
7821 person learning
359900 person learning
3350 person learning
180660 person learning
48569 person learning
18603 person learning
40936 person learning
1549 person learning
1183 person learning
32909 person learning
On some Android phones, the file information cannot be obtained by input file. What's going on?
Decode name as follows:
There are experts abroad who can read and obtain file streams. Is this the only way? http://stackoverflow.com/ques...
业精于勤,荒于嬉;行成于思,毁于随。
It seems that this problem is still difficult to solve, so I will solve it myself
Since the file.type read directly is an empty string, the file header information can only be read from the file stream.
Refer to the link scheme in the question, it is optimized here
function checkFileType(type, file, back) { /** * type png jpg mp4 ... * file input.change=> this.files[0] * back callback(boolean) */ // http://www.garykessler.net/library/file_sigs.html var args = arguments; if (args.length != 3) { back(0); } var type = args[0]; // type = '(png|jpg)' , 'png' var file = args[1]; var back = typeof args[2] == 'function' ? args[2] : function() {}; if (file.type == '') { // 如果系统无法获取文件类型,则读取二进制流,对二进制进行解析文件类型 var imgType = [ 'ff d8 ff', //jpg '89 50 4e', //png '0 0 0 14 66 74 79 70 69 73 6F 6D', //mp4 '0 0 0 18 66 74 79 70 33 67 70 35', //mp4 '0 0 0 0 66 74 79 70 33 67 70 35', //mp4 '0 0 0 0 66 74 79 70 4D 53 4E 56', //mp4 '0 0 0 0 66 74 79 70 69 73 6F 6D', //mp4 '0 0 0 18 66 74 79 70 6D 70 34 32', //m4v '0 0 0 0 66 74 79 70 6D 70 34 32', //m4v '0 0 0 14 66 74 79 70 71 74 20 20', //mov '0 0 0 0 66 74 79 70 71 74 20 20', //mov '0 0 0 0 6D 6F 6F 76', //mov '4F 67 67 53 0 02', //ogg '1A 45 DF A3', //ogg ]; var typeName = [ 'jpg', 'png', 'mp4', 'mp4', 'mp4', 'mp4', 'mp4', 'm4v', 'm4v', 'mov', 'mov', 'mov', 'ogg', 'ogg', ]; var sliceSize = /png|jpg|jpeg/.test(type) ? 3 : 12; var reader = new FileReader(); reader.readAsArrayBuffer(file); reader.addEventListener("load", function(e) { var slice = e.target.result.slice(0, sliceSize); reader = null; if (slice && slice.byteLength == sliceSize) { var view = new Uint8Array(slice); var arr = []; view.forEach(function(v) { arr.push(v.toString(16)); }); view = null; console.log(arr.join(' ')); var idx = arr.join(' ').indexOf(imgType); if (idx > -1) { back(typeName[idx]); console.log(typeName[idx]); } else { back(false); } } else { back(false); } }); } else { var type = file.name.match(/\.(\w+)$/)[1]; back(type); } }
How to use:
input.addEventListener(function(){ var file = this.files[0]; if(file.type==''){ // 第一个参数支持单类型,或多类型,多类型时用竖线分隔,用于生成正则式 checkFileType('(png|jpg|jpeg|mp4|mov|m4v|ogg)',file,function(fileType){ console.log(fileType); //'png' }); checkFileType('jpg',file,function(fileType){ console.log(fileType); //false }); } });
Only judge the common formats of png, jpg, jpeg, mp4, mov, m4v, ogg. For file header information of other file types, you can view it here: http://www.garykessler.net/li.. .
It seems that this problem is still difficult to solve, so I will solve it myself
Since the file.type read directly is an empty string, the file header information can only be read from the file stream.
Refer to the link scheme in the question, it is optimized here
How to use:
Only judge the common formats of png, jpg, jpeg, mp4, mov, m4v, ogg. For file header information of other file types, you can view it here:
http://www.garykessler.net/li.. .