1

我编写了一个流星应用程序,在 FileReader API 的帮助下将二进制数据切片发送到服务器。

在客户端处理切片的方法:

var readSlice = function() {
    var start, end;

    start = chunk * chunkSize;

    if (start > file.size) {
        start = end + 1;
    }

    end = start + (chunkSize - 1) >= file.size ? file.size : start + (chunkSize - 1);

    fileReader.onload = function(event) {
        if (++chunk <= chunks) {
            Meteor
                .apply("saveChunk", [ event.target.result.split(',')[1], file.name, clientRegistration, now, (chunk === chunks) ], {
                    wait : true
                });

            readSlice();
        } else {
            /*
             * TODO Notify the GUI
             */
            console.log("reading done");
        }
    };

    fileReader.readAsDataURL(blobSlice.call(file, start, end));
};

服务器以正确的顺序接收切片,并按以下方式合并:

saveChunk : function(chunk, name, registration, timestamp, last) {

    ...

    tempFile = Meteor.fileTemp + "/" + identifier;

    fs.appendFile(tempFile, new Buffer(chunk, "base64"), {
    encoding : "base64",
    mode : 438,
    flag : "w"
    }, function(error) {
        if (error) {
            throw (new Meteor.Error(500, "Failed to save file.", err));
        }
    });
}

这个过程几乎可以正常工作。但是,文件中的细微差别会导致输出损坏。二进制差异发生在文件中输出被拆分的位置,所以event.target.result属性上的拆分调用可能有问题,或者我在编码方面遗漏了一些明显的东西......?

该问题似乎与拆分有关,因为合并文件与原始文件的差异显示以下有趣的模式:

合并文件的模式

4

1 回答 1

1

损坏的数据是一个简单的计算错误的结果:

使用

end = (start + chunkSize ) >= file.size ? file.size : (start + chunkSize);

代替

end = start + (chunkSize - 1) >= file.size ? file.size : start + (chunkSize - 1);

解决了问题。

于 2013-11-20T11:01:13.520 回答