gpt4 book ai didi

javascript - chrome 扩展 - 根据魔数(Magic Number)获取文件类型

转载 作者:行者123 更新时间:2023-12-02 23:47:21 25 4
gpt4 key购买 nike

我需要编写一个 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);
});

我需要更改代码,以根据文件的魔数(Magic Number)获取它。

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

如何?

最佳答案

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

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方法来读取文件。由于我们只需要前几个字节,我认为没有必要读取整个文件。

此外,魔数(Magic Number)表非常有限,应该针对现实生活中的应用进行改进。

根据评论进行编辑

仅供引用,所有这些操作都是在客户端级别执行的。 ReadFile只能读取客户端机器的文件。所以这里没有下载。如果您尝试读取服务器中的文件以在下载之前检查其魔数(Magic Number),这是不可能的,因为服务器不允许您使用客户端读取其中的文件。

服务器可以准备一个 URL 来接收传入调用,然后以文件、页面或信息进行响应。但是制作一个读取将要下载的文件的扩展是不可能的。您只能在下载后或至少在开始下载后读取该文件。

关于javascript - chrome 扩展 - 根据魔数(Magic Number)获取文件类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55796076/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com