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

3

我已经阅读了很多关于文件系统API和HTML5的文章,但是我仍然找不到一个可行的解决方案,所以我向大家求助:

我想要一个文件上传表单,拖放或常规输入框都可以,但我希望能够选择一个文件,在上传后它应该将文件或整个文件夹“上传”到位于客户机计算机上的文件系统。上传用括号括起来是因为我实际上想将文件/文件夹复制到客户端的本地文件系统中。

这是否可能?因为我想制作一个应用程序,用户可以上传他的文件,如音乐或大型视频和电影到他的本地文件系统,并在我的应用程序中编辑/观看等等。我知道如果要上传这些大文件,我必须将它们切成几块并逐个加载,但我只是想先从简单的开始 :)

提前感谢


1
你的意思是“从客户端文件系统中选择文件,并将它们写入(复制)到客户端文件系统的其他位置”吗?没有“上传”。 - Bergi
2个回答

4

目前这个主题的信息确实很少,因此我组合了一个示例,其中包括:

  • <input type="file">上使用webkitdirectory属性。
    • 这允许用户使用适当的对话框选择目录。
  • 使用文件系统API。
    • 这涉及沙盒文件系统,它允许您在客户端机器上存储文件。
  • 使用文件API。
    • 这是允许您读取文件的API。 通过<input type="file">元素、拖放传输或通过文件系统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)下载文件和2)HTML5文件系统API。选项#1显然不允许您的应用程序选择目标,而选项#2仅适用于由浏览器创建的沙箱文件系统。这个限制可能对您来说并不是致命的 - 这意味着您的应用程序使用的文件夹将被埋在浏览器的数据文件中的某个地方。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接