【问题标题】:How to read/write local files through a web page?如何通过网页读/写本地文件?
【发布时间】:2012-08-14 23:14:44
【问题描述】:

我正在编写一个基于 html 的应用程序,并希望从本地文件存储和检索数据。此应用不会托管在网络服务器上。

谁能帮助启发主题如何做到这一点?

【问题讨论】:

  • 许多提供对 HTML5 文件 API 的参考,但据我所知,此 API 并非旨在读取预先确定的路径和文件名,而是必须通过文件选择器对话框进行选择。对大多数人来说不方便。尽管我会提供该上下文以节省您一些时间。

标签: javascript html local-storage read-write


【解决方案1】:

你应该使用 FileSystem API HTML5:

window.requestFileSystem(window.TEMPORARY, 5*1024*1024, function(){
    fs.root.getFile('test.dat', {}, function(fileEntry) {
        fileEntry.file(function(file) {
            // Here is our file object ... 
        });
    });
}, errorHandler);

结帐FileSystem API以获取更多参考

访问The HTML5 Test 测试浏览器支持

【讨论】:

【解决方案2】:

如果(且仅当)您的平台是 IE,您可以利用 HTA(HTML 应用程序)框架:

http://msdn.microsoft.com/en-us/library/ms536471(VS.85).aspx

使用它的应用程序被授予系统级权限,并且可以使用与 Windows 脚本主机相同的对象(例如文件系统对象来读取和访问本地文件)。

我过去曾成功地将它用于小型工作组应用程序并且很喜欢它 - 但这是在仅限 IE 的企业环境中。

【讨论】:

  • 为什么不使用适用于所有现代浏览器的 FileSystem API?
  • 重复一遍:如果(且仅当)您的平台将是 IE - 大多数企业环境仍然如此。
  • 抱歉我的平台是基于 chrome 的。
【解决方案3】:

【讨论】:

  • html5rocks.com 在这里被屏蔽了,你能举个例子吗?我用了代理,但还是一样,网页打不开:(
  • 一般来说,答案应该不仅仅是链接 - meta.stackexchange.com/a/8259
【解决方案4】:

此问题的答案取决于您对以下问题的回答:

  • 您是否同意目前仅在基于 Chromium 的浏览器(Chrome 和 Opera)中支持写入文件?
  • 您是否愿意使用目前专有的 API 来利用这种功能?
  • 您是否同意将来删除上述 API?
  • 您是否同意将使用上述 API 创建的文件限制到磁盘上的 沙盒(文件在该位置之外不会产生任何影响)?
  • 您是否可以使用虚拟文件系统(磁盘上的目录结构不一定以与从浏览器中访问时相同的形式存在)来表示此类文件?

如果您对以上所有问题都回答“是”,那么使用 FileFileWriterFileSystem API,您可以使用 Javascript 从浏览器选项卡/窗口的上下文中写入文件。

你问的怎么样?

BakedGoods*

写入文件:

bakedGoods.set({
    data: [{key: "testFile", value: "Hello world!", dataFormat: "text/plain"}],
    storageTypes: ["fileSystem"],
    options: {fileSystem:{storageType: Window.PERSISTENT}},
    complete: function(byStorageTypeStoredItemRangeDataObj, byStorageTypeErrorObj){}
});

读取文件:

bakedGoods.get({
        data: ["testFile"],
        storageTypes: ["fileSystem"],
        options: {fileSystem:{storageType: Window.PERSISTENT}},
        complete: function(resultDataObj, byStorageTypeErrorObj){}
});

使用原始 File、FileWriter 和 FileSystem API

写入文件:

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);

读取文件:

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);

但是如果你在一开始对任何问题的回答都是“否”呢?

如果您对非本地解决方案持开放态度,Silverlight 还允许通过IsolatedStorage 进行来自选项卡/窗口竞赛的文件 i/o。但是,使用此功能需要managed code;需要编写此类代码的解决方案超出了此问题的范围。

当然,一个使用补充托管代码的解决方案,只留下一个 Javascript 来编写,完全在这个问题的范围内;):

//Write file to first of either FileSystem or IsolatedStorage
bakedGoods.set({
    data: [{key: "testFile", value: "Hello world!", dataFormat: "text/plain"}],
    storageTypes: ["fileSystem", "silverlight"],
    options: {fileSystem:{storageType: Window.PERSISTENT}},
    complete: function(byStorageTypeStoredItemRangeDataObj, byStorageTypeErrorObj){}
});

*BakedGoods 由这里的这个人维护 :)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-19
    • 1970-01-01
    • 2012-08-05
    • 1970-01-01
    • 1970-01-01
    • 2018-07-01
    • 1970-01-01
    相关资源
    最近更新 更多