我需要编写一个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
如何?
答案 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,然后使用文件,页面或信息进行响应。但是无法进行扩展以读取将下载的文件。您只能在下载后或至少在开始下载后读取文件。