解决phonegap 2.9 多次上传导致的 线程占用异常.

虽然是个很老的版本,但是优势是支持 清理缓存。同时没有什么太高的要求。

最近实现一个对话功能,需要能实现类似微信的上传录音功能。

录音好说,但是多次上传时,会报错,最终发现是线程被占用,释放做得不好啊。。

两个解决方案,修改原代码。用filereader代替。

简单解决。用filereader 读取录取后的文件,然后传到服务器。

代码如下:

获取文件内容

function getData(filepath, datacall, failcall) {
	var path = filepath;
	var level = "window.requestFileSystem";
	if (typeof failcall != 'undefined') {
		fail = failcall;
	} else {
		function fail(error) {
			// console.log(evt);
			// evt.target.
			console
					.log("gddebug file getData " + level + " fail "
							+ error.code);
		}
	}
	if (typeof datacall == 'undefined') {
		datacall = function(data) {
		};
	}
	window.requestFileSystem(LocalFileSystem.PERSISTENT, 0,
			function(fileSystem) {
				level = "fileSystem.root.getFile";
				console.log('gddebug fileSystem.root.getFile ' + path);
				fileSystem.root.getFile(path, null, function(fileEntry) {
					level = "fileEntry.file";
					fileEntry.file(function(file) {
						console.log("gddebug readAsDataURL");
						var reader = new FileReader();
						reader.onloadend = function(evt) {
							console.log("gddebug" + "Read as data URL");
							console.log("gddebug" + evt.target.result);
							datacall(evt.target.result);
						};
						reader.readAsDataURL(file);
					}, fail);
				}, fail);
			}, fail);
}

上传文件:

function uploadFile(url, filepath, wincall, failcall, calltype) {
	if (typeof calltype == 'undefined') {
		calltype = 'html';
	}
	filepath = filepath.replace(/^file:///, '');
	getData(filepath, function(data) {
		$.post(url, {
			file : data,
			filename : basename(filepath)
		}, wincall, calltype);
	}, failcall)
}

服务器解析代码:

if(isset($_POST['file'])){
	if(empty($_POST['file'])){
		sjson(false,$title,'');
	}
	$filepath='record/'.$_POST['filename'];
	$_POST['file']=preg_replace('/^data:[^;]+?;base64,/','',$_POST['file']);
	$_POST['file']=base64_decode($_POST['file']);
	file_put_contents($filepath,$_POST['file']);
}

补充amr 转 mp3版本

if(isset($_POST['file'])){
	if(empty($_POST['file'])){
		sjson(false,$title,'');
	}
	$filepath='record/'.$_POST['filename'];
	$_POST['file']=preg_replace('/^data:[^;]+?;base64,/','',$_POST['file']);
	$_POST['file']=base64_decode($_POST['file']);
	file_put_contents($filepath,$_POST['file']);
	if(preg_match('/.amr/i',$filepath)){
		$target_mp3=preg_replace('/.amr$/i','.mp3',$filepath);
		//将amr转换成mp3
		exec("java -jar amr.jar {$filepath} {$target_mp3}");
		$filepath=$target_mp3;
	}
	$urlpath='http://192.168.0.144/test/phonegap/www/upload/'.$filepath;
	sjson(true,$title,'',array('path'=>$urlpath,'html'=>$html));
}

 

编写可直接命令运行的jar文件

准备一个完整的项目.

各种类需要放在里面进行正常引用。外部引用类需要放进来。

打包工具:eclipse 需要支持导出 runnable jar file.老版本只能导出jar

操作:eclipse 右键 export -> java->runnable jar file.

然后就可以直接命令运行。也可以通过php进行调用了。

对于需要传入的参数。就是 public static void main(String[] args) 这个args 东东了。

第一个参数就是args[0]

比如写了一个amr转mp3的jar。执行代码

java -jar amrtomp3.jar “amr filepath”  “mp3 filepath”