我正在尝试为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也始终是相同的值。