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



我需要编写一个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_(编程)#Magic_numbers_in_files

如何?

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

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,然后用文件、页面或信息进行响应。但是制作一个扩展名来读取将要下载的文件是不可能的。您只能在下载后或至少在开始下载后读取文件。

相关内容

  • 没有找到相关文章

最新更新