Javascript 您可以使用HTML5本地存储来存储文件吗?如果没有,怎么做?

Javascript 您可以使用HTML5本地存储来存储文件吗?如果没有,怎么做?,javascript,html,flash,local-storage,Javascript,Html,Flash,Local Storage,如何通过浏览器机制(插件是可接受的解决方案)缓存/管理用户计算机上的许多大型文件(视频)。据我所知,本地存储是关于数据库类型的数据,而不是文件。文件系统API[1,2]将是您未来的最佳选择,在某一点上它是非常前沿的。然而,w3c已经放弃了它。根据他们自己的文件: 关于本文件的工作已停止,不应引用或用作实施的基础 在大多数实现中,HTML5本地存储目前默认限制为5MB。我认为你不能在那里储存很多视频 来源:以上解释了html5本地存储的大部分内容 这里有一个类似的问题,不是关于视频的,而是是否

如何通过浏览器机制(插件是可接受的解决方案)缓存/管理用户计算机上的许多大型文件(视频)。据我所知,本地存储是关于数据库类型的数据,而不是文件。

文件系统API[1,2]将是您未来的最佳选择,在某一点上它是非常前沿的。然而,w3c已经放弃了它。根据他们自己的文件:

关于本文件的工作已停止,不应引用或用作实施的基础


  • 在大多数实现中,HTML5本地存储目前默认限制为5MB。我认为你不能在那里储存很多视频


    来源:

    以上解释了html5本地存储的大部分内容

    这里有一个类似的问题,不是关于视频的,而是是否可以将xml添加到本地存储

    在我的回答中,我提到了一篇文章:javascript用于将xml解析到本地存储以及如何脱机查询


    可能会对您有所帮助。

    将为您包装HTML5文件系统API,使在沙盒文件系统中存储、管理和操作大型文件集变得非常容易。

    正如其他人所说,HTML5文件系统API已经死了。IndexedDB似乎是另一种选择。请参阅。

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

    • 目前只有基于Chrome的浏览器(Chrome&Opera)支持编写文件,您对此满意吗
    • 您是否愿意使用截至目前为止的专有API来利用这种能力
    • 您对将来删除上述API的可能性是否满意
    • 将使用上述API创建的文件压缩到磁盘上的沙盒(文件无法产生影响的位置)中,您是否满意
    • 使用虚拟文件系统(磁盘上的目录结构不一定与从浏览器中访问时的形式相同)来表示此类文件,您满意吗
    如果您对以上所有内容的回答都是“是”,那么使用、和API,您可以使用Javascript从浏览器选项卡/窗口的上下文中读取和写入文件

    下面是一些简单的示例,说明如何直接和间接地使用API来完成这些工作:

    *

    写入文件:

    //"SGVsbG8gd29ybGQh" is "Hello world!" encoded in Base64; raw binary data can
    //also be written with the use of Typed Arrays and the appropriate mime type
    bakedGoods.set({
        data: [{key: "testFile", value: "SGVsbG8gd29ybGQh", 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)
                {
                    //"SGVsbG8gd29ybGQh" is "Hello world!" encoded in Base64;
                    //raw binary data can also be written with the use of 
                    //Typed Arrays and the appropriate mime type
                    var dataBlob = new Blob(["SGVsbG8gd29ybGQh"], {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

    写入文件:

    //"SGVsbG8gd29ybGQh" is "Hello world!" encoded in Base64; raw binary data can
    //also be written with the use of Typed Arrays and the appropriate mime type
    bakedGoods.set({
        data: [{key: "testFile", value: "SGVsbG8gd29ybGQh", 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)
                {
                    //"SGVsbG8gd29ybGQh" is "Hello world!" encoded in Base64;
                    //raw binary data can also be written with the use of 
                    //Typed Arrays and the appropriate mime type
                    var dataBlob = new Blob(["SGVsbG8gd29ybGQh"], {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);
    

    由于您也对非本机(基于插件)解决方案开放,因此可以利用中Silverlight启用的文件i/o,通过Silverlight提供对该文件的访问

    IsolatedStorage在许多方面与文件系统类似,特别是它也存在于沙箱中,并利用虚拟文件系统。但是,需要使用该设施;需要编写此类代码的解决方案超出了此问题的范围

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


    *BakedGoods正是由这个家伙维护的:)

    我不想让我的计算机空间被缓存的视频占用……可能是,但这更适合图像而不是视频。@JCOC611:大体上,我的意思是10-30兆。我说的很多,是指10个。关于使用某人的带宽(特别是在加拿大!)存在争议,但我不认为100-300兆的已使用空间会让你丧命。这可能是一种选择加入功能(这就是为什么插件解决方案可以被接受)。W3C指定web存储的目的是大型本地缓存:“特别是,出于性能原因,web应用程序可能希望在客户端存储兆字节的用户数据,例如整个用户编写的文档或用户的邮箱。”--但我会给用户一个选项,让你的应用程序(授予它权限)能够做到这一点-不过这只是个人偏好,虽然看起来是别人共享的。是的,如果是可选的,实际上这似乎是一个很好的功能。谢谢。“需要记住的一点是,您存储的是字符串,而不是原始格式的数据。”您认为通过对视频进行Base64编码、压缩,然后对压缩文件进行Base64编码并将其放入web存储中,会不会有任何大小缩减?我见过压缩文本缩小到原始大小的一小部分。解码和解压缩也会耗电。@John我认为通过将压缩的二进制数据转换为文本,您无法进一步压缩它。Base64编码二进制数据的全部目的是允许您将其存储为字符串,如果您将该字符串压缩,它将转换回二进制数据,因此,你基本上是在打自己的脚。@Klinky你可以使用一种文本压缩算法来压缩文本,这种算法基本上是将字母混合在一起。也就是说,它保持Base64编码,只是“优化”。不过,我不认为你会在已经压缩的随机数据方面取得多大成功。哇,甚至按照标准,浏览器正在变成一个操作系统!