使用JavaScript进行本地文件访问
是否有使用JavaScript完成的本地文件操作?我正在寻找一个解决方案,可以完成没有安装足迹像需要使用JavaScript进行本地文件访问,javascript,file-access,Javascript,File Access,是否有使用JavaScript完成的本地文件操作?我正在寻找一个解决方案,可以完成没有安装足迹像需要 具体来说,我想从一个文件中读取内容,然后将这些内容写入另一个文件。此时,我并不担心获得权限,我只是假设我已经拥有这些文件的完全权限。如果您在Windows上部署,则为文件系统和其他本地资源提供了非常有用的JScript API。但是,将WSH脚本合并到本地web应用程序可能并不像您希望的那样优雅。更新自Firefox 17以来,此功能已被删除(请参阅) 在Firefox上,您(程序员)可以在J
具体来说,我想从一个文件中读取内容,然后将这些内容写入另一个文件。此时,我并不担心获得权限,我只是假设我已经拥有这些文件的完全权限。如果您在Windows上部署,则为文件系统和其他本地资源提供了非常有用的JScript API。但是,将WSH脚本合并到本地web应用程序可能并不像您希望的那样优雅。更新自Firefox 17以来,此功能已被删除(请参阅)
在Firefox上,您(程序员)可以在JavaScript文件中执行此操作:
netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");
netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserWrite");
系统将提示您(浏览器用户)允许访问。(对于Firefox,每次启动浏览器时只需执行一次)
如果浏览器用户是其他人,他们必须授予权限。如果用户通过
选择文件,您可以使用
设计不允许读取或写入任意文件。这违反了沙箱规则。发件人:
JavaScript和DOM提供了
恶意作者攻击的可能性
交付要在客户端上运行的脚本
通过网络使用计算机。浏览器作者
使用两种方法控制这种风险
限制。首先,脚本运行在
他们只能在其中执行任务的沙箱
与web相关的操作,而不是
通用编程任务,如
创建文件
2016更新:可以通过和直接访问文件系统。有关详细信息,请参阅。中只提供了HTML5功能的更新。这篇优秀的文章将详细解释JavaScript中的本地文件访问。上述文章的摘要: 本规范提供了以下几个接口:
或从桌面拖动文件目录)请参阅下面Paul D.Waite的评论。假设JavaScript代码可能需要的任何文件都应该由用户直接允许。著名浏览器的创建者通常不允许JavaScript访问文件 该解决方案的主要思想是:JavaScript代码无法通过其本地URL访问该文件。 但是,它可以通过其DataURL来使用该文件:因此,如果用户浏览并打开一个文件,JavaScript应该直接从HTML获取“DataURL”,而不是获取“URL” 然后使用readAsDataURL函数和FileReader对象将DataURL转换为文件。 源代码和更完整的指南,以及一个很好的示例,见:
如果您需要访问客户端上的整个文件系统、读/写文件、查看文件夹的更改、启动应用程序、加密或签名文档等。请查看JSFS 它允许从您的网页安全无限制地访问客户端上的计算机资源,而无需使用浏览器插件技术,如AcitveX或Java Applet。然而,也必须安装一个和平的软件 为了使用JSF,您应该具备Java和JavaEE开发(servlet)的基本知识
请在此处找到JSFS:。它是免费的,并在GPL下获得许可包装了W3C正在标准化的新HTML5文件系统API,并提供了一种极其简单的方式来读取、写入或遍历本地沙盒文件系统。它是异步的,因此文件I/O不会干扰用户体验。:) NW.js允许您使用Javascript创建桌面应用程序,而无需浏览器上通常设置的所有安全限制。因此,您可以使用函数运行可执行文件,或创建/编辑/读取/写入/删除文件。您可以访问硬件,例如当前CPU使用量或使用的ram总量等 您可以使用它创建不需要任何安装的windows、linux或mac桌面应用程序
如前所述,和API以及API可用于从浏览器选项卡/窗口的上下文向客户端计算机读写文件 关于文件系统和FileWriter API,您应该注意以下几点,其中一些已经提到,但值得重复:
- API的实现目前仅存在于基于Chrome的浏览器(Chrome和Opera)中
- 这两个API于2014年4月24日脱离了W3C标准轨道,截至目前为专有
- 将来可以从实现浏览器中删除(现在是专有的)API
- 沙盒(磁盘上的一个位置,文件在该位置之外不会产生任何效果)用于存储使用API创建的文件
- 一个虚拟文件系统(磁盘上的目录结构不一定与从浏览器中访问时的形式相同)用于表示使用API创建的文件
bakedGoods.set({
data: [{key: "testFile", value: "Hello world!", dataFormat: "text/plain"}],
storageTypes: ["fileSystem"],
options: {fileSystem:{storageType: Window.PERSISTENT}},
complete: function(byStorageTypeStoredItemRangeDataObj, byStorageTypeErrorObj){}
});
function onQuotaRequestSuccess(grantedQuota)
{
function saveFile(directoryEntry)
{
function createFileWriter(fileEntry)
{
function write(fileWriter)
{
var dataBlob = new Blob(["Hello world!"], {type: "text/plain"});
fileWriter.write(dataBlob);
}
fileEntry.createWriter(write);
}
directoryEntry.getFile(
"testFile",
{create: true, exclusive: true},
createFileWriter
);
}
requestFileSystem(Window.PERSISTENT, grantedQuota, saveFile);
}
var desiredQuota = 1024 * 1024 * 1024;
var quotaManagementObj = navigator.webkitPersistentStorage;
quotaManagementObj.requestQuota(desiredQuota, onQuotaRequestSuccess);
读取文件:
bakedGoods.get({
data: ["testFile"],
storageTypes: ["fileSystem"],
options: {fileSystem:{storageType: Window.PERSISTENT}},
complete: function(resultDataObj, byStorageTypeErrorObj){}
});
function onQuotaRequestSuccess(grantedQuota)
{
function getfile(directoryEntry)
{
function readFile(fileEntry)
{
function read(file)
{
var fileReader = new FileReader();
fileReader.onload = function(){var fileData = fileReader.result};
fileReader.readAsText(file);
}
fileEntry.file(read);
}
directoryEntry.getFile(
"testFile",
{create: false},
readFile
);
}
requestFileSystem(Window.PERSISTENT, grantedQuota, getFile);
}
var desiredQuota = 1024 * 1024 * 1024;
var quotaManagementObj = navigator.webkitPersistentStorage;
quotaManagementObj.requestQuota(desiredQuota, onQuotaRequestSuccess);
使用原始文件、FileWriter和文件系统API
写入文件:
bakedGoods.set({
data: [{key: "testFile", value: "Hello world!", dataFormat: "text/plain"}],
storageTypes: ["fileSystem"],
options: {fileSystem:{storageType: Window.PERSISTENT}},
complete: function(byStorageTypeStoredItemRangeDataObj, byStorageTypeErrorObj){}
});
function onQuotaRequestSuccess(grantedQuota)
{
function saveFile(directoryEntry)
{
function createFileWriter(fileEntry)
{
function write(fileWriter)
{
var dataBlob = new Blob(["Hello world!"], {type: "text/plain"});
fileWriter.write(dataBlob);
}
fileEntry.createWriter(write);
}
directoryEntry.getFile(
"testFile",
{create: true, exclusive: true},
createFileWriter
);
}
requestFileSystem(Window.PERSISTENT, grantedQuota, saveFile);
}
var desiredQuota = 1024 * 1024 * 1024;
var quotaManagementObj = navigator.webkitPersistentStorage;
quotaManagementObj.requestQuota(desiredQuota, onQuotaRequestSuccess);
读取文件:
bakedGoods.get({
data: ["testFile"],
storageTypes: ["fileSystem"],
options: {fileSystem:{storageType: Window.PERSISTENT}},
complete: function(resultDataObj, byStorageTypeErrorObj){}
});
function onQuotaRequestSuccess(grantedQuota)
{
function getfile(directoryEntry)
{
function readFile(fileEntry)
{
function read(file)
{
var fileReader = new FileReader();
fileReader.onload = function(){var fileData = fileReader.result};
fileReader.readAsText(file);
}
fileEntry.file(read);
}
directoryEntry.getFile(
"testFile",
{create: false},
readFile
);
}
requestFileSystem(Window.PERSISTENT, grantedQuota, getFile);
}
var desiredQuota = 1024 * 1024 * 1024;
var quotaManagementObj = navigator.webkitPersistentStorage;
quotaManagementObj.requestQuota(desiredQuota, onQuotaRequestSuccess);
尽管文件系统和FileWriter API不再符合标准,但在我看来,在某些情况下,它们的使用是合理的,因为:
- 联合国实施的浏览器供应商再次对其感兴趣,这可能会使他们对b产生兴趣