Filesystem API - 从本地驱动器上传到本地文件系统

时间:2012-05-23 13:13:27

标签: javascript html5 upload html5-filesystem

我已经阅读了很多关于文件系统API和HTML5的内容,但我找不到一个可行的解决方案,所以我问你们:

我想要一个文件上传表单,拖放或常规输入框无关紧要,但我想选择一个文件,上传后应该取文件或整个文件夹并“上传”到位于文件系统在客户端计算机上。上传在括号中,因为我实际上想将文件/文件夹复制到客户端本地文件系统。

甚至可能吗?因为我想创建一个应用程序,用户可以将他的文件(如音乐或大型视频和电影)上传到他的本地文件系统,并在我的应用程序中编辑/观看等等。我知道我必须上传那些大文件,我必须将它们切成碎片并加载它们,但我只是想开始一点:)

提前致谢

2 个答案:

答案 0 :(得分:4)

目前关于这个主题的信息确实很少,所以我把一个结合起来的例子放在一起:

  • 使用webkitdirectory上的<input type="file">属性。
    • 这允许用户使用适当的对话框选择目录。
  • 使用Filesystem API。
    • 这是关于沙盒文件系统,它允许您在客户端的计算机上存储文件。
  • 使用File API。
    • 这是允许您读取文件的API。可以通过<input type="file">元素,使用拖放操作或通过Filesystem API访问这些文件。

由于这些目前仅适用于Chrome,因此我在必要时使用了webkit前缀。

http://jsfiddle.net/zLna6/3/

代码本身有评论,我希望这些评论是明确的:

var fs,
    err = function(e) {
        throw e;
    };

// request the sandboxed filesystem
webkitRequestFileSystem(
    window.TEMPORARY,
    5 * 1024 * 1024,
    function(_fs) {
        fs = _fs;
    },
    err
);

// when a directory is selected
$(":file").on("change", function() {
    $("ul").empty();

    // the selected files
    var files = this.files;
    if(!files) return;

    // this function copies the file into the sandboxed filesystem
    function save(i) {
        var file = files[i];

        var text = file ? file.name : "Done!";

        // show the filename in the list
        $("<li>").text(text).appendTo("ul");

        if(!file) return;

        // create a sandboxed file
        fs.root.getFile(
            file.name,
            { create: true },
            function(fileEntry) {
                // create a writer that can put data in the file
                fileEntry.createWriter(function(writer) {
                    writer.onwriteend = function() {
                        // when done, continue to the next file
                        save(i + 1);
                    };
                    writer.onerror = err;

                    // this will read the contents of the current file
                    var fr = new FileReader;
                    fr.onloadend = function() {
                        // create a blob as that's what the
                        // file writer wants
                        var builder = new WebKitBlobBuilder;
                        builder.append(fr.result);
                        writer.write(builder.getBlob());
                    };
                    fr.onerror = err;
                    fr.readAsArrayBuffer(file);
                }, err);
            }, 
            err
        );
    }

    save(0);
});

$("ul").on("click", "li:not(:last)", function() {
    // get the entry with this filename from the sandboxed filesystem
    fs.root.getFile($(this).text(), {}, function(fileEntry) {
        // get the file from the entry
        fileEntry.file(function(file) {
            // this will read the contents of the sandboxed file
            var fr = new FileReader;
            fr.onloadend = function() {
                // log part of it
                console.log(fr.result.slice(0, 100));
            };
            fr.readAsBinaryString(file);
        });
    }, err);
});

答案 1 :(得分:1)

这确实是不可能的,但你的应用程序仍然可能有效。可以通过file input表单元素读取文件,但是将文件写回磁盘会遇到麻烦。

浏览器可以写入磁盘的两种方式是1)下载文件和2)HTML5 filesystem API。选项#1显然不允许您的应用程序选择目标,选项#2仅适用于浏览器创建的沙箱文件系统。这种限制可能不会对您造成破坏 - 它只是意味着您的应用程序使用的文件夹将被隐藏在浏览器的数据文件中。

此外,Filesystem API目前仅限Chrome(但它是开放标准)。如果您需要跨平台支持,也许可以使用IndexedDB。您可以使用localStorage,但Chrome有5MB的限制,这对于媒体应用程序来说非常糟糕。