Ionic/Cordova文件插件在iOS设备上连续下载大量文档时无法写入文件
用户看到的问题是:Ionic/Cordova文件插件在iOS设备上连续下载大量文档时无法写入文件,ios,angular,cordova,ionic-framework,filesystems,Ios,Angular,Cordova,Ionic Framework,Filesystems,用户看到的问题是: 用户有一长串需要下载到iOS设备(200+)的文档 用户开始下载,并连续下载每个文件 在下载队列的末尾,他们发现其中一个文件失败(并且总是两个25MB+的特定文件中的一个) 他们重试作业(只下载失败的文档),作业成功 作为开发人员,我看到的是: 我的应用程序将文档作为一个blob下拉 当我检查blob(在我的Typescript应用程序代码中)时,它的大小大于0 我调用this.file.writeFile(directoryPath,fileName,blob,{repla
this.file.writeFile(directoryPath,fileName,blob,{replace:true})
,它调用围绕Cordova文件插件的爱奥尼亚文件包装器write
中的blob时,它的大小为零- 每次在iOS xCode模拟器中尝试下载时,都可以下载完整的文件列表。这让我相信这可能是一个记忆问题,但我不确定
- 故障总是发生在大约200个文件之后,并且发生在两个25-30MB文件中的一个文件上+
private writeFileInChunks(writer: FileWriter, file: Blob) {
console.log('SIZE OF FILE AT START', file.size);
const BLOCK_SIZE = 1024 * 1024;
let writtenSize = 0;
function writeNextChunk() {
const size = Math.min(BLOCK_SIZE, file.size - writtenSize);
console.log('CALCULATED SIZE:', size);
const chunk = file.slice(writtenSize, writtenSize + size);
console.log('SIZE OF CHUNK TO WRITE', chunk.size)
writtenSize += size;
writer.write(chunk);
}
return getPromise<any>((resolve, reject) => {
writer.onerror = reject as (event: ProgressEvent) => void;
writer.onwrite = () => {
if (writtenSize < file.size) {
writeNextChunk();
} else {
resolve();
}
};
writeNextChunk();
});
}
重试时:
SIZE OF FILE AT START: 34012899
CALCULATED SIZE: 1048576
SIZE OF CHUNK TO WRITE: 1048576
CALCULATED SIZE: 1048576
SIZE OF CHUNK TO WRITE: 1048576
...
...
...
CALCULATED SIZE: 458467
SIZE OF CHUNK TO WRITE: 458467
因此,无论出于何种原因,在之前的大量下载之后,file.slice步骤会导致一个空的/损坏的blob
关于如何纠正这个问题有什么想法吗
使用一些扩展日志运行另一个测试:
private writeFileInChunks(writer: FileWriter, file: Blob) {
...
function writeNextChunk() {
const size = Math.min(BLOCK_SIZE, file.size - writtenSize);
console.log('CALCULATED SIZE:', size);
console.log('WRITTEN SIZE', writtenSize);
console.log('SUMS TO:', writtenSize + size)
console.log('FILE SIZE BEFORE SLICE:', file.size);
const chunk = file.slice(writtenSize, writtenSize + size);
console.log('SIZE OF CHUNK TO WRITE', chunk.size);
writtenSize += size;
writer.write(chunk);
}
...
...
}
产出如下:
CALCULATED SIZE: 1048576
WRITTEN SIZE: 0
SUMS TO: 1048576
FILE SIZE BEFORE SLICE: 34012899
SIZE OF CHUNK TO WRITE 0
进一步证实了这一问题
private writeFileInChunks(writer: FileWriter, file: Blob) {
...
function writeNextChunk() {
const size = Math.min(BLOCK_SIZE, file.size - writtenSize);
console.log('CALCULATED SIZE:', size);
console.log('WRITTEN SIZE', writtenSize);
console.log('SUMS TO:', writtenSize + size)
console.log('FILE SIZE BEFORE SLICE:', file.size);
const chunk = file.slice(writtenSize, writtenSize + size);
console.log('SIZE OF CHUNK TO WRITE', chunk.size);
writtenSize += size;
writer.write(chunk);
}
...
...
}
CALCULATED SIZE: 1048576
WRITTEN SIZE: 0
SUMS TO: 1048576
FILE SIZE BEFORE SLICE: 34012899
SIZE OF CHUNK TO WRITE 0