如何在onReadFileRequested侦听器上实现fileSystemProvider API?

时间:2017-02-06 14:32:34

标签: jquery google-chrome-extension

我正在尝试为Chrome操作系统实现fileSystemProvider。

我被困在onReadFileRequested事件上。

文档在这里: https://developer.chrome.com/apps/fileSystemProvider#event-onReadFileRequested

我也看过两个样本: https://developer.chrome.com/extensions/samples#search:onreadfilerequested

我的第一个问题是hasMore有什么意义?在这两个例子中,很难设置为假。在我的情况下,我需要异步下载块。如果我将hasMore设置为true,它就会挂起。如果我将hasMore设置为false,它将循环到下一个字节范围。什么?

因此将hasMore设置为false,它似乎迭代字节范围就好了除了...我不知道如何让它停止。最终我的逻辑请求一个无效的字节范围,提示我的API返回416错误,停止循环。该文件全部存在,但“文件”应用程序显示错误。即使hasMore为false,如何阻止它循环?是否有基于文件长度的设定迭代次数?

这是我的代码。我正在使用jQuery使用自定义ajaxTransport来生成ajax请求来处理ArrayBuffer类型。

ajaxTransport:

$.ajaxTransport("+binary", function(options, originalOptions, jqXHR){
    if (window.FormData &&
        ((options.dataType && (options.dataType === 'binary')) ||
         (options.data && ((window.ArrayBuffer && options.data instanceof ArrayBuffer) ||
                           (window.Blob && options.data instanceof Blob))))) {
        return {
            send: function(_, callback){
                console.log(callback);
                var xhr = new XMLHttpRequest(),
                    url = options.url,
                    type = options.type,
                    dataType = options.responseType || "blob",
                    data = options.data || null;
                xhr.addEventListener('load', function(){
                    var data = {};
                    data[options.dataType] = xhr.response;
                    callback(xhr.status, xhr.statusText, data, xhr.getAllResponseHeaders());
                });
                xhr.open(type, url, true);
                for (var key in options.headers) {
                    xhr.setRequestHeader(key, options.headers[key]);
                }
                xhr.responseType = dataType;
                xhr.send(data);
            },
            abort: function(){
                jqXHR.abort();
            }
        };
    }
});

监听器:

function readFile(options, successCallback, errorCallback){
    var filePath = opened_files[options.openRequestId];
    client.readFile(filePath, options.offset, options.length, function(data, hasMore){
        successCallback(data, hasMore);
    }, errorCallback);
}

readFile函数:

readFile: function(filePath, offset, length, successCallback, errorCallback){
    var url = <api_url> + filePath;
    $.ajax(url, {
        method: 'GET',
        headers: {"Range": "bytes=" + offset + "-" + (offset + length -1)},
        dataType: "binary",
        responseType: "arraybuffer",
        success: function(dataBuffer){
            successCallback(dataBuffer, false);
        },
        error: function(err){
            errorCallback();
        }
    });
},

编辑:我已经考虑了下面的一些评论,但仍未取得进展。似乎我还没有完全理解是什么让onReadFile停止迭代并要求更多的块。我也注意到进度条永远不会上升。 options.length也始终是相同的值。

0 个答案:

没有答案