使用JavaScript进行本地文件访问

使用JavaScript进行本地文件访问,javascript,file-access,Javascript,File Access,是否有使用JavaScript完成的本地文件操作?我正在寻找一个解决方案,可以完成没有安装足迹像需要 具体来说,我想从一个文件中读取内容,然后将这些内容写入另一个文件。此时,我并不担心获得权限,我只是假设我已经拥有这些文件的完全权限。如果您在Windows上部署,则为文件系统和其他本地资源提供了非常有用的JScript API。但是,将WSH脚本合并到本地web应用程序可能并不像您希望的那样优雅。更新自Firefox 17以来,此功能已被删除(请参阅) 在Firefox上,您(程序员)可以在J

是否有使用JavaScript完成的本地文件操作?我正在寻找一个解决方案,可以完成没有安装足迹像需要


具体来说,我想从一个文件中读取内容,然后将这些内容写入另一个文件。此时,我并不担心获得权限,我只是假设我已经拥有这些文件的完全权限。

如果您在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中的本地文件访问。上述文章的摘要:

本规范提供了以下几个接口:

  • 文件-单个文件;提供只读信息,例如名称、文件大小、MIME类型和对文件句柄的引用
  • FileList—类似数组的文件对象序列。(考虑
    或从桌面拖动文件目录)
  • Blob-允许将文件切片为字节范围

  • 请参阅下面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桌面应用程序

    如果您使用angularjs&aspnet/mvc来检索json文件,那么 必须在web配置中允许mime类型


    如前所述,和API以及API可用于从浏览器选项卡/窗口的上下文向客户端计算机读写文件

    关于文件系统和FileWriter API,您应该注意以下几点,其中一些已经提到,但值得重复:

    • API的实现目前仅存在于基于Chrome的浏览器(Chrome和Opera)中
    • 这两个API于2014年4月24日脱离了W3C标准轨道,截至目前为专有
    • 将来可以从实现浏览器中删除(现在是专有的)API
    • 沙盒(磁盘上的一个位置,文件在该位置之外不会产生任何效果)用于存储使用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产生兴趣