本帖最后由 waahah 于 2024-12-12 07:22 编辑
谢邀哈,先说结论:由于浏览器内容安全策略CSP ,所以无法在无任何交互的情况下读取文件
但是可以使用File System Access API读取指定的文件目录来避免层层选择文件,通过配置起始目录(startIn )来尝试让用户更便捷地定位到指定文件所在目录,然后尝试引导用户手动确认就可以了,下面给出简短示例:
// 配置文件选择器选项
const options = {
types: [
{
description: 'javascript Files',
accept: {
'text/x-csrc': ['.js']
}
}
],
excludeAcceptAllOption: true,
multiple: false,
// 尝试配置起始目录字符串或使用 FileSystemHandle 对象,不过其兼容性和实际效果可能因浏览器版本等因素受限
startIn: 'downloads'
};
async function readSpecificFile() {
try {
const [fileHandle] = await window.showOpenFilePicker(options);
const file = await fileHandle.getFile();
if (file.name === '你的文件.js') {
const reader = new FileReader();
reader.onload = function (e) {
const fileContent = e.target.result;
console.log('文件内容如下:', fileContent);
// 可以在此处对文件内容做进一步的处理
};
reader.readAsText(file);
} else {
console.error('选择的文件不是指定的.js文件');
}
} catch (error) {
console.error('文件选择或读取出现错误:', error);
}
}
readSpecificFile();
至于浏览器监测USB设备的插入和拔出等信息可以采用轮询的方式来实现
let connectedDevices = [];
async function checkUSBDevices() {
try {
// 获取当前连接的 USB 设备
const devices = await navigator.usb.getDevices();
// 比对当前设备列表和之前的设备列表
const newDevices = devices.filter(device => !connectedDevices.some(d => d.device !== device.device));
const removedDevices = connectedDevices.filter(device => !devices.some(d => d.device === device.device));
// 处理新插入的设备
if (newDevices.length > 0) {
console.log('新设备插入:', newDevices);
}
// 处理拔出的设备
if (removedDevices.length > 0) {
console.log('设备拔出:', removedDevices);
}
// 更新已连接设备列表
connectedDevices = devices;
} catch (error) {
console.error('检测 USB 设备时出错:', error);
}
}
// 每隔 2 秒轮询一次
setInterval(checkUSBDevices, 2000);
处理USB连接数据
try {
const device = await navigator.usb.requestDevice({ filters: [{ vendorId: 0x1234 }] }); // 替换为你的设备的 vendorId
await device.open(); // 打开设备
await device.selectConfiguration(1); // 选择配置
await device.claimInterface(0); // 声明接口
document.getElementById('status').innerText = '已连接到设备: ' + device.productName;
// 读取数据
const result = await readData(device);
console.log(result);
// 这里可配合File System Access API实现上传密钥内容的逻辑,例如发送到服务器
} catch (error) {
console.error(error);
document.getElementById('status').innerText = '错误: ' + error;
}
async function readData(device) {
const transferIn = await device.transferIn(5, 64); // 读取数据,参数需要根据设备配置调整
const decoder = new TextDecoder();
return decoder.decode(transferIn.data);
}
|