Javascript 使用HTML5从CD读取文件,webkitdirectory比读取本地文件花费更多时间
我有一个web应用程序,允许用户将DICOM和非DICOM文件上载到他们的帐户。我正在使用JavaScript、HTML5、Webkitdirectory、Chrome和Datatable在UI上填充选定的文件。我面对的问题是: 当从本地计算机选择文件时,下面的代码似乎运行得非常快,所选文件会立即在UI上填充,但当从CD中选择相同数量的文件时,在UI上渲染需要时间。以下是一个例子- 对于包含20个DICOM+2个非DICOM研究以及大约2241个图像的CD,第一次填充列表大约需要5-6分钟 在用户界面上。如果我尝试选择相同的CD文件夹,列表将填充到 大约60秒,如果在同一时间之前填充过一次 会议 但是如果我使用来自本地机器的同一组文件,那么在UI上填充大约需要6-7秒 这是我为每个DICOM文件执行的代码-Javascript 使用HTML5从CD读取文件,webkitdirectory比读取本地文件花费更多时间,javascript,webkit,cd,html5-filesystem,Javascript,Webkit,Cd,Html5 Filesystem,我有一个web应用程序,允许用户将DICOM和非DICOM文件上载到他们的帐户。我正在使用JavaScript、HTML5、Webkitdirectory、Chrome和Datatable在UI上填充选定的文件。我面对的问题是: 当从本地计算机选择文件时,下面的代码似乎运行得非常快,所选文件会立即在UI上填充,但当从CD中选择相同数量的文件时,在UI上渲染需要时间。以下是一个例子- 对于包含20个DICOM+2个非DICOM研究以及大约2241个图像的CD,第一次填充列表大约需要5-6分钟 在用
var fileReader = new FileReader();
fileReader.onload = function(evt){
console.log("Completed Reading");
var arrayBuffer = fileReader.result;
var byteArray = new Uint8Array(arrayBuffer);
_parseDicom(byteArray);
try {
if (fileReader.readyState !== 2) {
fileReader.abort();
}
}
catch (err) {
console.log('error occured: '+err);
}
}
var blob = f.slice(0, 50000);
console.log("Starting to Read");
fileReader.readAsArrayBuffer(blob);
在分析了我提出的问题之后
- 我想最基本的一点是,操作系统需要时间将CD装入内存,因为它是一个外部驱动器如果我们第二次访问,需要的时间会更少,因为CD内容已经装入
- 从CD读取文件时,从“开始读取”到“完成读取”之间的时间相对比从本地机器读取文件的时间多
- 我还试着查找DICOMDIR文件,它是光盘上包含的所有研究文件的索引,包含它的原因正是:避免长时间扫描光盘。但是我没有找到用JavaScript解析DICOMDIR文件的任何标准或方法
当我们上传任何DICOMDIR文件时 这里的问题是我无法同时收集所有患者、研究、系列或图像。我找到的唯一解决方案是反复检查它是否是患者,研究,系列或图像对象
有没有更好的检索方法/标准???您可以回答自己的问题:只需阅读DICOMDIR即可。DICOMDIR遵循相同的DICOM标准,因此您可以使用任何DICOM库读取它。我确实尝试使用相同的DICOM库进行解析。使用
fileReader.readAsArrayBuffer(blob)
我们得到一个空的fr.result()
如果我们使用fileReader.readAsText(blob)代码>我们得到二进制字符?是的,是同一个。真倒霉!您可能希望将此报告为错误上游:。您是否至少可以使用第三方工具(例如gdcmdump DICOMDIR)检查此文件的内容。
var fr = new FileReader();
fr.onload = function(evt){
var byteArray = new Uint8Array(fr.result);
try {
var dataSet = dicomParser.parseDicom(byteArray);
_searchDicom(dataSet, f);
} catch (err) {
if (typeof err.dataSet != 'undefined') {
_searchDicom(err.dataSet, f);
}
}
}
var blob = f.slice(0, 1000000);
fr.readAsArrayBuffer(blob);
function _searchDicom(dataset,f) {
var data = dataset.elements.x00041220.items;
if(data) {
data.forEach(function (e) {
if (e.dataSet.string('x00041430') === 'PATIENT') {
console.log("Patient Name - "+e.dataSet.string('x00100010'));
}
else if (e.dataSet.string('x00041430') === 'STUDY') {}
else if (e.dataSet.string('x00041430') === 'SERIES') {}
else if (e.dataSet.string('x00041430') === 'IMAGE') {}
});
}
}