如何通过网页读取/写入本地文件

How to read/write local files through a web page?

本文关键字:文件 何通过 网页 读取      更新时间:2023-09-26

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

任何人都可以帮助启发如何做到这一点的话题吗?

你应该使用文件系统 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);

签出文件系统 API 以获取更多参考

访问 HTML5 测试以测试浏览器支持

尝试 HTML 5 文件系统 API

以下链接有详细信息

http://dev.w3.org/2009/dap/file-system/pub/FileSystem/

http://www.html5rocks.com/en/tutorials/file/filesystem/

这个问题的答案取决于你对以下问题的回答:

  • 你对目前只存在于基于Chromium的浏览器(Chrome和Opera)中对写入文件的支持感到满意吗?
  • 您是否可以使用现有的专有 API 来利用这种功能?
  • 您对将来删除所述 API 的可能性好吗?
  • 您是否可以接受将使用所述 API 创建的文件限制到磁盘上的沙箱(文件无法产生任何影响的位置)?
  • 您是否可以使用虚拟文件系统(一种目录结构,它不一定以与从浏览器中访问时相同的形式存在于磁盘上)来表示此类文件?

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

你问怎么样?

烘焙食品*

写文件:

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

使用原始文件、文件编写器和文件系统 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。但是,使用此工具需要托管代码;需要编写此类代码的解决方案超出了此问题的范围。

当然,一个使用互补的托管代码的解决方案,只留下一个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){}
});

*烘焙食品由这家伙维护:)

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

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

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

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