感觉学了很多东西。。。又感觉有更多的需要去学。。。
月份:2015年11月
解决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”