ukey/html/filemanager.html
2026-04-30 17:43:09 +08:00

416 lines
18 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>SFK测试</title>
<link rel='stylesheet' href="../css/styles.css" />
<script type="text/javascript" src="../fiseckey.js"></script>
<script language="JavaScript">
var dev = 0;
var app = 0;
var con = 0;
var conname = 0;
var flag = 0;
function PrintInfo(info) {
deviceManagerText.value = deviceManagerText.value + info + "\r\n";
document.getElementById("deviceManagerText").scrollTop = document.getElementById("deviceManagerText").scrollHeight;
}
function clearconsole() {
deviceManagerText.value = "";
document.getElementById("deviceManagerText").scrollTop = document.getElementById("deviceManagerText").scrollHeight;
}
function seturl(dev,app,con,conname) {
document.getElementById("indexhtml").href="../index.html?dev="+dev+"&app="+app+"&con="+con+"&conname="+conname;
document.getElementById("devhtml").href="./devicemanager.html?dev="+dev+"&app="+app+"&con="+con+"&conname="+conname;
document.getElementById("authhtml").href="./authmanager.html?dev="+dev+"&app="+app+"&con="+con+"&conname="+conname;
document.getElementById("apphtml").href="./appmanager.html?dev="+dev+"&app="+app+"&con="+con+"&conname="+conname;
document.getElementById("filehtml").href="./filemanager.html?dev="+dev+"&app="+app+"&con="+con+"&conname="+conname;
document.getElementById("containerhtml").href="./containermanager.html?dev="+dev+"&app="+app+"&con="+con+"&conname="+conname;
document.getElementById("servicehtml").href="./service.html?dev="+dev+"&app="+app+"&con="+con+"&conname="+conname;
flag = 1;
}
function decodeurl() {
var url = window.location.href;
var tmp = url.split('?');
var param = tmp[1].split('&');
dev = param[0].split('=')[1];
app = param[1].split('=')[1];
con = param[2].split('=')[1];
conname = param[3].split('=')[1];
}
window.onload=function() {
if(flag != 1)
decodeurl();
seturl(dev,app,con,conname);
}
function reload() {
if(flag != 1)
decodeurl();
seturl(dev,app,con,conname);
}
//function
function CreateFile() {
try {
var filename = authManage.filename.value;
var filesize = authManage.filesize.value;
var readright = authManage.readright.value;
var writeright = authManage.writeright.value;
var result = SKFKEY.SKF_CreateFile(app, filename, filesize, 16, 16);
if(result == 0)
PrintInfo("创建成功");
} catch (e) {
PrintInfo(e.message);
}
}
function DeleteFile() {
try {
var filename = authManage.filename.value;
var result = SKFKEY.SKF_DeleteFile(app, filename);
if(result == 0)
PrintInfo("删除成功");
} catch (e) {
PrintInfo(e.message);
}
}
function EnumFiles() {
try {
var result = SKFKEY.SKF_EnumFiles(app);
PrintInfo(result);
} catch (e) {
PrintInfo(e.message);
}
}
function GetFileInfo() {
try {
var filename = authManage.filename.value;
var result = SKFKEY.SKF_GetFileInfo(app, filename);
PrintInfo(JSON.stringify(result));
} catch (e) {
PrintInfo(e.message);
}
}
function ReadFile() {
try {
var filename = authManage.filename1.value;
var offset = parseInt(authManage.rwoffset.value);
//var datalen = parseInt(authManage.dataLen.value);
var len = SKFKEY.SKF_ReadFile(app, filename, 0, 3);
len = parseInt( len, 10 );
var result = SKFKEY.SKF_ReadFile(app, filename, 3, len)
PrintInfo("文件数据:" + result);
console.log(hexToObject(result))
} catch (e) {
PrintInfo(e.message);
}
}
function ReadFile1() {
try {
var filename = authManage.filename1.value;
var offset = parseInt(authManage.rwoffset.value);
var datalen = parseInt(authManage.dataLen.value);
var result = SKFKEY.SKF_ReadFile(app, filename, offset, datalen);
PrintInfo("文件数据:" + result);
console.log(hexToObject(result))
} catch (e) {
PrintInfo(e.message);
}
}
// 将 HEX 字符串转换为对象
function hexToObject(hexString) {
// 去除填充的 F 字符,寻找有效的 JSON 数据
let str = hexString.replace(/F+$/, ''); // 去除字符串末尾的 F 字符
// 每两位HEX字符转换成一个字符
let jsonString = ''
for (let i = 0; i < str.length; i += 2) {
jsonString += String.fromCharCode(parseInt(str.substr(i, 2), 16))
}
console.log('解析 JSON 数据', jsonString);
// 尝试解析 JSON 数据
try {
return JSON.parse(jsonString); // 返回解析后的 JSON 对象
} catch (e) {
return { error: "无法解析 JSON", rawString: jsonString }; // 返回解析失败的错误信息
}
// 将 JSON 字符串解析为对象
// return JSON.parse(jsonString);
}
function WriteFile() {
try {
var filename = authManage.filename1.value;
var offset = parseInt(authManage.rwoffset.value);
var data = authManage.writedata.value;
var datalen = parseInt(authManage.dataLen.value);
var len = '000000' + datalen
len = len.substr(len.length - 6)
writeData(app, filename, 0, datalen + 3, (len+data).toUpperCase())
PrintInfo("写入成功 File");
} catch (e) {
PrintInfo(e.message);
}
}
function WriteFile1() {
try {
var filename = authManage.filename1.value;
var offset = parseInt(authManage.rwoffset.value);
var data = authManage.writedata.value;
var datalen = parseInt(authManage.dataLen.value);
var result = SKFKEY.SKF_WriteFile(app, filename, offset, datalen, data);
if(result == 0)
PrintInfo("写入成功");
} catch (e) {
PrintInfo(e.message);
}
}
function writeData(app, filename, offset, datalen, data) {
var block = 512;
if (datalen <= block) {
SKFKEY.SKF_WriteFile(app, filename, offset, datalen, data);
} else {
// 先写入 block
var cdata = data.substr(0, block * 2)
SKFKEY.SKF_WriteFile(app, filename, offset, block, cdata);
// 检查
var result = SKFKEY.SKF_ReadFile(app, filename, offset, block);
if(result == cdata){
PrintInfo("写入成功" + offset);
} else {
PrintInfo("写入失败" + offset);
PrintInfo("写入" + cdata);
PrintInfo("读取" + result);
}
setTimeout(() => {
writeData(app, filename, offset + block, datalen - block, data.substr(block * 2))
}, 1000);
}
}
// function writeData(app, filename, offset, datalen, data) {
// const CHUNK_SIZE = 1000; // 每次固定写 1000 字节
// const HEX_CHUNK = CHUNK_SIZE * 2; // 2000 个 HEX 字符
// let currentOffset = offset;
// let remainingData = data;
// let isFirst = true;
// while (remainingData.length > 0) {
// let chunkHex;
// // ====================== 核心逻辑 ======================
// if (isFirst) {
// // 第一次:直接取前 2000 个字符
// chunkHex = remainingData.substring(0, HEX_CHUNK);
// isFirst = false;
// } else {
// // 第2、3、4次前面补 2000 个 0 + 取后面 2000 个字符
// const realData = remainingData.substring(0, HEX_CHUNK);
// chunkHex = '0'.repeat(HEX_CHUNK) + realData;
// }
// // 实际长度
// const chunkSize = chunkHex.length / 2;
// // 调用写入
// SKFKEY.SKF_WriteFile(app, filename, currentOffset, chunkSize, chunkHex);
// // 偏移 + 剩余数据截断
// currentOffset += CHUNK_SIZE;
// remainingData = remainingData.substring(HEX_CHUNK);
// }
// }
function readData(app, filename, offset, datalen) {
let result = SKFKEY.SKF_ReadFile(app, filename, offset, readLen);
// // 最终结果
// let result = '';
// // 每次最大读取长度
// const MAX_READ = 1000;
// // 循环分段读取(比递归更安全、更易读)
// while (datalen > 0) {
// // 本次读取长度:取 2000 和剩余长度的较小值
// const readLen = Math.min(MAX_READ, datalen);
// // 读取一段数据
// const chunk = SKFKEY.SKF_ReadFile(app, filename, offset, readLen);
// // 拼接到结果
// result += chunk;
// // 偏移量前进
// offset += readLen;
// // 剩余长度减少
// datalen -= readLen;
// }
// // 最终返回完整数据
return result;
}
</script>
</head>
<body>
<div="root">
<header>
<div>
<h1 class="title">
SKF FisecKey demo
</h1>
<ul class="menu">
<li>
<a id = indexhtml onclick="reload()" href="../index.html?dev=0&app=0&con=0&conname=0">简介</a>
</li>
<li>
<a id = devhtml onclick="reload()" href="./devicemanager.html?dev=0&app=0&con=0&conname=0">设备管理</a>
</li>
<li>
<a id = apphtml onclick="reload()" href="./appmanager.html?dev=0&app=0&con=0&conname=0">应用管理</a>
</li>
<li>
<a id = authhtml onclick="reload()" href="./authmanager.html?dev=0&app=0&con=0&conname=0">访问控制</a>
</li>
<li>
<a id = filehtml onclick="reload()" href="./filemanager.html?dev=0&app=0&con=0&conname=0" class='active'>文件管理</a>
</li>
<li>
<a id = containerhtml onclick="reload()" href="./containermanager.html?dev=0&app=0&con=0&conname=0">容器管理</a>
</li>
<li>
<a id = servicehtml onclick="reload()" href="./service.html?dev=0&app=0&con=0&conname=0">密码服务</a>
</li>
</ul>
</div>
</header>
<main>
<div class = "form1">
<form name = "authManage">
<div class="form-group">
<div class="line">
<div class="lineleft">
<label class="labelhead" for="filename">文件名称</label>
</div>
<div class="lineright">
<input type="text" id="filename"/>
</div>
</div>
<div class="line">
<div class="lineleft">
<label class="labelhead" for="filesize">文件大小</label>
</div>
<div class="lineright">
<input type="text" id="filesize"/>
</div>
</div>
<div class="line">
<div class="lineleft">
<label class="labelhead" for="readright">读权限</label>
</div>
<div class="lineright">
<select class="select" name="readrightName" id="readright">
<option value="16">操作员</option>
<option value="1">管理员</option>
<option value="255">所有人</option>
<option value="0">禁止访问</option>
</select>
</div>
</div>
<div class="line">
<div class="lineleft">
<label class="labelhead" for="writeright">写权限</label>
</div>
<div class="lineright">
<select class="select" name="writerightName" id="writeright">
<option value="16">操作员</option>
<option value="1">管理员</option>
<option value="255">所有人</option>
<option value="0">禁止访问</option>
</select>
</div>
</div>
<div class="line">
<input class="btn" type="button" value="枚举文件" onclick="EnumFiles()" />
<input class="btn" type="button" value="获取文件信息" onclick="GetFileInfo()" />
||
<input class="btn" type="button" value="创建文件" onclick="CreateFile()" />
<input class="btn" type="button" value="删除文件" onclick="DeleteFile()" />
</div>
<div class="line"><div class="hrline"></div></div>
<div class="line">
<div class="lineleft">
<label class="labelhead" for="filename1">文件名称</label>
</div>
<div class="lineright">
<input type="text" id="filename1" value="lmk"/>
</div>
</div>
<div class="line">
<div class="lineleft">
<label class="labelhead" for="writedata">写入数据</label>
</div>
<div class="lineright">
<textarea class="textarea1" id="writedata" cols="30" rows="2"></textarea>
</div>
</div>
<div class="line-help">
<div class="help-tip">
<p>
写入数据为原始数据的HEX串相应的数据长度应为HEX串的一半
</p>
</div>
</div>
<div class="line">
<div class="lineleft">
<label class="labelhead" for="rwoffset">读写偏移</label>
</div>
<div class="lineright">
<input type="text1" class="shortline" id="rwoffset" value="0"/>
</div>
</div>
<div class="line">
<div class="lineleft">
<label class="labelhead" for="dataLen">数据长度</label>
</div>
<div class="lineright">
<input type="text1" class="shortline" id="dataLen" value=""/>
</div>
</div>
<div class="line">
<input class="btn" type="button" value="整段写文件" onclick="WriteFile1()" />
<input class="btn" type="button" value="整段读文件" onclick="ReadFile1()" />
<input class="btn" type="button" value="分段写文件" onclick="WriteFile()" />
<input class="btn" type="button" value="分段读文件" onclick="ReadFile()" />
</div>
</div>
</form>
</div>
</main>
</div>
<div class="footer">
<input type="button" class="footclear" value="清空" onclick="clearconsole()" />
<textarea class="footconsole" id="deviceManagerText" rows="8"></textarea>
</div>
</body>
</html>