代码之家  ›  专栏  ›  技术社区  ›  iammilind

如何用Javascript/Typescript为浏览器编写任意大小的文件?通过Websocket传输的文件[副本]

  •  0
  • iammilind  · 技术社区  · 8 年前

    我想知道有没有什么方法可以从HTML5/JS写文件?在broswer。。。

    0 回复  |  直到 15 年前
        1
  •  21
  •   Niko Sams    13 年前
        2
  •  24
  •   ecmanaut    13 年前

    假设您的最终目标是让用户将您的文件保存到可以找到它的地方,比如右键单击链接并选择“另存为…”,那么这些API还没有广泛的浏览器覆盖范围,可能是出于安全考虑。

    你能做的,不管有没有API,都是通过链接到 data: uri download 属性指定建议的文件名。例如:

    <a id="save" download="earth.txt" href="data:text/plain,mostly harmless&#10;">Save</a>
    

    mostly harmless (和尾随的新行)如 earth.txt 在下载目录中。要从javascript设置文件内容,请先调用此函数:

    function setSaveFile(contents, file_name, mime_type) {
      var a = document.getElementById('save');
      mime_type = mime_type || 'application/octet-stream'; // text/html, image/png, et c
      if (file_name) a.setAttribute('download', file_name);
      a.href = 'data:'+ mime_type +';base64,'+ btoa(contents || '');
    }
    
        3
  •  5
  •   Pankaj Parashar    12 年前

    是的,可以使用HTML5+JS读写文件。

    链接以开始- Exploring FileSystem API

    前段时间我还为SpeckyBoy写了一篇文章,关于同一个主题,你可能会觉得有用- http://speckyboy.com/2012/10/30/getting-to-grips-with-the-html5-file-api-2/

        4
  •  1
  •   Angus    15 年前

    据我所知,你不能从HTML5写文件,因为让网页访问用户的文件会有安全风险。

    如果您只需要存储一些数据,以便您的页面稍后可以访问它,HTML5确实有一种称为Web存储的东西可以做到这一点。

    或者可以将数据存储在cookies(如果非常小)或服务器上。

        5
  •  1
  •   Newclique    10 年前

    另一种可能性是考虑在Windows平台上创建类似ClickOnce的应用程序。这将提供一个指向可下载可执行文件的链接,该可执行文件将在用户的操作系统中运行,但可以进行基于web的回调以发送和检索数据。ClickOnce应用程序可以嵌入一个浏览器控件,因此您将拥有一个与web兼容的应用程序,能够直接与用户的存储进行通信。

        6
  •  1
  •   Kevin    10 年前

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

    • 目前只有基于Chrome的浏览器(Chrome&Opera)才支持这种功能,您对此满意吗?
    • 您是否可以利用目前为止的专有API来利用这种能力?
    • 将用上述API创建的文件压缩到 磁盘上的一个位置(文件在该位置之外不会产生任何影响)?

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

    与 BakedGoods

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

    文件系统规范没有定义如何在磁盘上显示目录结构的准则。例如,在基于Chromium的浏览器中,沙盒具有 虚拟文件系统 (一种目录结构,它不一定以从浏览器中访问时的相同形式存在于磁盘上),其中放置用api创建的目录和文件。

    *烘焙食品是由这里的这个人经营的:)

    推荐文章