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