chrome扩展名-根据幻数获取文件类型

时间:2019-04-22 14:34:05

标签: javascript google-chrome-extension magic-numbers

我需要编写一个chrome扩展名,它获取下载的文件类型。

这是扩展文件获取的现有代码。

chrome.downloads.onDeterminingFilename.addListener(function(item, __suggest) {

    function suggest(filename, conflictAction) {
        __suggest({
            filename: filename,
            conflictAction: conflictAction,
            conflict_action: conflictAction
        });
    }
    var fileType = item.fileName.substr(item.fileName.lastIndexOf('.') + 1);
    console.log(fileType);
});

我需要更改代码,以根据文件的幻数获得它。

https://en.wikipedia.org/wiki/Magic_number_(programming)#Magic_numbers_in_files

如何?

1 个答案:

答案 0 :(得分:1)

使用来自this page的信息,这是一种从文件中获取幻数的方法。请从计算机中选择一些类型不同的文件进行测试。

let filesRead = [];
let numFiles = 0;

function treatResult() {
	filesRead.map(e=>{
	        const uint = new Uint8Array(e.fileStart);
                let bytes = [];
                uint.forEach((byte)=>bytes.push(byte.toString(16)));
                e.magicNumber = bytes.join('').toUpperCase();
		e.typeFromMagicNumber = getTypeFromMagicNumber(e.magicNumber);
	});
	let list = filesRead.map(e=>
		'<li>Name: ' + e.name + ' ||| MimeType: ' + e.type + ' ||| Magic Number: ' + 
		    e.magicNumber + ' ||| Type from mn: ' + e.typeFromMagicNumber + '</li>').join('');
	document.getElementById('list').innerHTML = list;
}	

function getTypeFromMagicNumber(signature) {
	switch (signature) {
	    case '89504E47':
		return 'image/png'
	    case '47494638':
		return 'image/gif'
	    case '25504446':
		return 'application/pdf'
	    case 'FFD8FFDB':
	    case 'FFD8FFE0':
	    case 'FFD8FFE1':
		return 'image/jpeg'
	    case '504B0304':
		return 'application/zip'
	    default:
		return 'Unknown filetype'
	}
}

function treatFile(file) {
        const blob = file.slice(0, 4);
        var reader = new FileReader();
	reader.readAsArrayBuffer(blob);
	reader.onprogress = function(event) {
	    filesRead.push({name: file.name, type : file.type, fileStart: event.target.result});
	    reader.abort();
	    if (filesRead.length == numFiles) 
    		treatResult();
	};
}

function handleFileSelect(evt) {
	var files = evt.target.files;
	numFiles = files.length;
	for (var i = 0, f; f = files[i]; i++) 
    	treatFile(files[i]);
}

document.getElementById('files').addEventListener('change', handleFileSelect, false);
<html>
<body>
        <h1>List files with magic number types</h1>
        <input type="file" id="files" name="files[]" multiple />

        <ul id='list'></ul>

<script src="teste.js"></script>
</body>
</html>                     

请注意,输入返回的文件对象已经在type属性中通知了文件类型。

我提到的页面使用onloadend方法读取文件。由于我们只需要前几个字节,所以我认为没有必要读取整个文件。

魔术数字表非常有限,对于实际应用应加以改进。

编辑基于评论

仅供参考,所有这些操作都是在客户端级别执行的。 ReadFile只能读取客户端计算机的文件。因此,这里没有下载。如果您试图读取服务器中的文件以在下载前检查其幻数,则不可能,因为服务器不允许您使用客户端读取文件中的文件。

服务器可能有一个准备接收URL的URL,然后使用文件,页面或信息进行响应。但是无法进行扩展以读取将下载的文件。您只能在下载后或至少在开始下载后读取文件。