`

使用phonegap file api绕过ios localstorage 5M存储上限

阅读更多

先介绍下背景:项目是给予ipad的phonegap应用,其中保存很多业务数据,因为最初设计时候使用了local storage,后续便遇到了5M上限的困扰。

 

解决办法有几个,一个是换成web sql存储,phonegap使用native的sqlite,但要把格式化数据(json)映射到数据库关系表中;一种是用file api,phonegap使用native的file api;但两种方式的编程方式都是回调式的,要改动很多代码。

 

想实现一种阻塞的数据读取的方式,思路如下:使用file api做write,在write的时候通过传入方法,在local storage中保存write file的绝对路径,读取file不用file api,而使用ajax的阻塞请求。

 

经过编码测试,可以实现,中间有几个注意的地方:

1. 在file api write的过程中或代码之后(异步未执行完),不要用alert——因为会阻塞掉;

2. phonegap提供的file api是用native重写的,和html5的不完全一样,如LocalFileSystem, filewriter write(String)

 

贴下代码

var XFile = {
	writeFile: function(fileName, txt, fnCallbackWithPath){
		if(!fileName || !txt)
			return;

		var size = 0;
		var fnReq = window.requestFileSystem || window.webkitRequestFileSystem;
		var type = X.isPhonegap ? window.LocalFileSystem.PERSISTENT : window.TEMPORARY;

		fnReq(type, size, function(fsHandler){
			fsHandler.root.getFile(fileName, {create: true, exclusive: false}, function(entry){
				entry.createWriter(function(writer){
					writer.onerror = function(error) {
						X.log('Web file write exception 1 : ' + error);
					}

					// safari -> write(txt) directly
					if(X.isPhonegap){
						try {
							writer.write(txt);
						}catch(error){
							X.log('Web file write exception 2 : ' + error);
						}
					}else{
						var size = 0;
						writer.onwriteend = function () {
							writer.onwriteend = null;
							writer.truncate(size);
							X.log('Web file write ok : ' + fileName);
						}
						try {
							var blobBulder = new WebKitBlobBuilder();
							blobBulder.append(txt);
							var blob = blobBulder.getBlob();
							size = blob.size;

							writer.write(blobBulder.getBlob());
						}catch(error){
							X.log('Web file write exception 2 : ' + error);
						}
					}
				}, function(error){
					X.log('Web file write exception 3 : ' + error);
				});

				if(fnCallbackWithPath){
					fnCallbackWithPath(entry.toURL());
				}
			}, function(error){
				X.log('Web file write exception caught : ' + error);
			});
		}, function(){
			X.log('Web file api not support!');
		});
	}, 

	deleteFile: function(fileName){
		if(!fileName)
			return;

		var size = 0;
		var fnReq = window.requestFileSystem || window.webkitRequestFileSystem;
		var type = X.isPhonegap ? LocalFileSystem.PERSISTENT : window.TEMPORARY;

		fnReq(type, size, function(fsHandler){
			fsHandler.root.getFile(fileName, null, function(entry){
				if(entry)
					entry.remove();
				X.log('Delete file : ' + entry.toURL());
			}, function(error){
				X.log('Web file delete exception caught : ' + error);
			});
		}, function(){
			X.log('Web file api not support!');
		});
	}, 

	readFile: function(fileName, fn){
		if(!fileName)
			return;

		var size = 0;
		var fnReq = window.requestFileSystem || window.webkitRequestFileSystem;
		var type = X.isPhonegap ? LocalFileSystem.PERSISTENT : window.TEMPORARY;

		fnReq(type, size, function(fsHandler){
			fsHandler.root.getFile(fileName, {create: false}, function(entry){
				if(entry){
					entry.file(function(file){
						var reader = XFile.getFileReader();
						fn(reader.readAsBinaryString(file.webkitSlice()));
					}, function(e){
						X.log('Web file read exception caught : ' + e.code);
					});
				}
			}, function(e){
				X.log('Web file read exception caught : ' + e.code);
			});
		}, function(){
			X.log('Web file api not support!');
		});
	}, 

	getFileReader: function(){
		var reader = new FileReader();
		reader.onabort = this.handler.abort;
		reader.onerror = this.handler.error;
		return reader;
	}, 

	handler: {
		abort: function(event) {
			X.log("this is FileReader's onabort event.");
		},
		error: function(event) {
			X.log("this is FileReader's onerror event.");
		}
	},

	dump: ''
}; 

 

有个国人童鞋写了一个html5 file api的封装,很8错,大家也可以使用那个HTML5-FileSystem-Demo-master

请搜索下github

 

 

分享到:
评论

相关推荐

    Phonegap_API_中文版

    5. **存储管理**:PhoneGap提供了Web Storage(localStorage和sessionStorage)以及SQLite数据库的支持,用于在本地存储应用数据。这些存储方式可以处理结构化的数据,且不会因浏览器关闭而丢失。 6. **通知与推送*...

    PhoneGap的API组件及使用方法

    下面将详细讨论PhoneGap的API组件以及如何在Android平台上使用PhoneGap。 **PhoneGap API组件** 1. **设备信息** (Device): PhoneGap提供了一个`device`对象,可以获取设备的唯一标识、型号、操作系统版本等信息。...

    PhoneGap,API帮助文档.zip

    这个"PhoneGap API帮助文档.zip"压缩包显然包含了关于如何使用PhoneGap API的详细指南,对于开发者来说是非常宝贵的资源。下面我们将深入探讨PhoneGap API中的关键组件及其功能。 1. **加速度计(Accelerometer)**...

    iOS 使用PhoneGap 开发HTML5 的APP

    PhoneGap是一种开源框架,它允许开发者使用HTML5、CSS3和JavaScript来构建原生的移动应用程序,尤其适合iOS平台。这个教程将引导你通过在Mac上使用PhoneGap开发iOS平台的HTML5应用。 首先,我们需要了解PhoneGap的...

    PhoneGap中文API帮助文档

    网上的phonegap中文帮助文档尚少,翻译也不太好,在此收集了一些翻译优秀的文章,并制作成chm的帮助文档,以帮助各位学习,此文档包含了phonegap的主要使用功能,并提供了完整示例

    html5框架PhoneGap API详解笔记(ppt及word版)

    6. **文件系统API(File System API)**:读写文件和目录,实现本地文件存储。 7. **通知API(Notification API)**:弹出警告框、振动设备或者显示通知。 8. **加速计API(Accelerometer API)**:获取设备的加速度...

    PhoneGap命令行工具快速创建IOS PhoneGap项目 基于Mac OS X

    PhoneGap命令行工具快速创建IOS PhoneGap项目,基于Mac OS X 有截图

    PhoneGap,API帮助文档翻译整理5-Device(设备)

    知识点:PhoneGap设备API及其应用 一、PhoneGap设备API概览 PhoneGap是一个开源框架,允许开发者使用HTML、CSS和JavaScript开发跨平台移动应用程序。设备API是PhoneGap提供的核心功能之一,它允许开发者访问设备的...

    PhoneGap iOS 自定义插件

    PhoneGap iOS 自定义插件是移动应用开发中的一个重要概念,它允许开发者利用JavaScript与原生iOS平台进行交互,实现更高效、更丰富的功能。PhoneGap是一个开源框架,它基于Apache Cordova,允许开发者使用HTML、CSS...

    Phonegap API (中文版)

    最新的Phonegap api 中文翻译版。让你快速入门。

    PhoneGap,API帮助文档翻译整理6-Contacts(通讯录)

    ### PhoneGap Contacts API详解 #### 一、简介 在移动应用开发中,有时我们需要访问用户的通讯录以便于实现社交功能或其他交互式应用需求。PhoneGap(现称Cordova)为开发者提供了一套丰富的API,使得跨平台应用...

    phonegap-API全

    phonegap官网API,大家就留交流

    PhoneGap中文API

    PhoneGap API文档会指导如何配置PhoneGap项目,使用Cordova命令行工具,以及如何处理iOS特有的界面和功能。 7. **插件开发**: PhoneGap允许自定义插件来扩展其功能。开发者可以通过阅读文档学习如何编写插件,将新...

    PhoneGap,API帮助文档翻译整理8-File_(文件)

    请注意,PhoneGap 的文件系统 API 在不同平台上可能存在差异,如 Android、BlackBerry WebWorks (OS 5.0 及以上) 和 iOS 都支持这些功能,但其他平台可能不完全兼容。因此,在编写代码时需要考虑到这些兼容性问题。

    phonegap api中文手册

    本手册为PhoneGap API的中文版指南,旨在为开发者提供全面、详细的API使用指导,帮助其利用PhoneGap框架开发跨平台移动应用。PhoneGap是一款基于HTML、CSS和JavaScript的技术栈,允许开发者构建适用于多个移动操作...

    PhoneGap中文API(稀有,且用且珍藏)

    PhoneGap中文API文档为开发者提供了如何使用PhoneGap内置模块进行移动应用开发的详细指导,尤其是利用JavaScript API来控制和访问移动设备的本地硬件功能。下面,我将详细阐述文档中提到的加速计(Accelerometer)...

    【DOC】PhoneGap_API

    PhoneGap_API是一个专门为移动应用开发者提供的关键资源,它允许开发者使用HTML、CSS和JavaScript来构建跨平台的原生移动应用程序。PhoneGap的核心理念是利用Web技术实现与移动设备硬件的交互,而无需深入学习各种...

    PhoneGap-拍照上传DEMO

    5. **AJAX异步上传**:使用XMLHttpRequest或者fetch API,可以实现图片的异步上传,这样即使在网络条件不理想的情况下也能保证较好的用户体验。 6. **服务器端处理**:上传的图片需要在服务器端存储,这涉及到文件...

    PhoneGap_API_中文说明_File(文件).doc

    PhoneGap_API_中文说明_File(文件),很好的android开发学习教材。

Global site tag (gtag.js) - Google Analytics