readAsDataURL损坏输出

时间:2013-09-30 15:04:56

标签: meteor filereader

我编写了一个流星应用程序,在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属性上的拆分调用有问题,或者我可能遗漏了编码方面明显的东西......?

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

The pattern of the merged file

1 个答案:

答案 0 :(得分:1)

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

使用

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

而不是

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

解决了问题。