PhoneGap 实现带进度条的文件上传(支持任意类型文件)

由于公司的业务需要,要实现PhoneGAP文件上传并显示进度条。一开始没有仔细看PhoneGAP API就草草开工,后来通过logcat才发现,上传过程中居然有动态刷新上传的字节数据。顿时泪奔,我手动实现的上传进度监听啊,不过既然写了,多少就有收获,详情见:http://blog.csdn.net/herestay/article/details/8567967

现在我们看看如何使用PhoneGAP自带的功能实现上传进度:


先是HTML

[html]  view plain copy
  1. <!DOCTYPE html>  
  2. <html>  
  3. <head>  
  4. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />  
  5. <meta name="format-detection" content="telephone=no" />  
  6. <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no, width=device-width" />   
  7. <link rel="stylesheet" href="css/base.css" />  
  8. <style type="text/css">  
  9. .upload_process_bar{  
  10.     width:100%;  
  11.     border:#ccc 1px solid;  
  12.     height:6px;  
  13.     padding:1px;  
  14.     background:#fff;  
  15.     -moz-border-radius:10px;  
  16.     -webkit-border-radius:10px;  
  17.     border-radius:10px;  
  18.     display:none;  
  19. }  
  20. .upload_current_process{  
  21.     height:6px;  
  22.     width:0%;  
  23.     background:#A4C639;  
  24.     -moz-border-radius:10px;  
  25.     -webkit-border-radius:10px;  
  26.     border-radius:10px;      
  27. }  
  28. </style>  
  29. <title>文件上传  - demo</title>  
  30. </head>  
  31. <body>  
  32.     <h1><a href="javascript:void(0)" id="upload_file_link">选择文件上传</a></h1>  
  33.       
  34.     <!-- 上传进度条 -->  
  35.     <div class="upload_process_bar">  
  36.         <div class="upload_current_process"></div>  
  37.     </div>  
  38.     <div id="process_info"></div>  
  39.       
  40.     <!-- 引用JS -->  
  41.     <script src="scripts/jquery-1.8.3.min.js"></script>  
  42.     <script src="scripts/cordova-2.2.0.js"></script>  
  43.     <script src="scripts/upload/upload.js"></script>  
  44.       
  45. </body>  
  46. </html>  
  47.    

jquery-1.8.3.min.js,cordova-2.2.0.js 这两个文件就不贴了,自己去网上下载就好。


upload.js

[javascript]  view plain copy
  1. /**FileTransfer*/  
  2. var ft;  
  3.   
  4. /** 
  5.  * 清除上传进度,处理上传失败,上传中断,上传成功 
  6.  */  
  7. function clearProcess() {  
  8.     $('.upload_process_bar,#process_info').hide();  
  9.     ft.abort();  
  10. };  
  11.   
  12. /** 
  13.  * 打开文件选择器,并让其支持所有文件的选择。 
  14.  */  
  15. function openFileSelector() {  
  16.     var source = navigator.camera.PictureSourceType.PHOTOLIBRARY;  
  17.     //描述类型,取文件路径  
  18.     var destinationType = navigator.camera.DestinationType.FILE_URI;  
  19.     //媒体类型,设置为ALLMEDIA即支持任意文件选择  
  20.     var mediaType = navigator.camera.MediaType.ALLMEDIA;  
  21.     var options={  
  22.         quality : 50,  
  23.         destinationType : destinationType,  
  24.         sourceType : source,  
  25.         mediaType : mediaType     
  26.     };  
  27.     navigator.camera.getPicture(uploadFile,uploadBroken,options);  
  28. };  
  29.   
  30. /** 
  31.  * 上传意外终止处理。 
  32.  * @param message 
  33.  */  
  34. function uploadBroken(message){  
  35.     alert(message);  
  36.     clearProcess();  
  37. };  
  38.   
  39. /** 
  40.  * 上传过程回调,用于处理上传进度,如显示进度条等。 
  41.  */  
  42. function uploadProcessing(progressEvent){  
  43.       
  44.     if (progressEvent.lengthComputable) {  
  45.         //已经上传  
  46.         var loaded=progressEvent.loaded;  
  47.         //文件总长度  
  48.         var total=progressEvent.total;  
  49.         //计算百分比,用于显示进度条  
  50.         var percent=parseInt((loaded/total)*100);  
  51.         //换算成MB  
  52.         loaded=(loaded/1024/1024).toFixed(2);  
  53.         total=(total/1024/1024).toFixed(2);  
  54.         $('#process_info').html(loaded+'M/'+total+'M');  
  55.         $('.upload_current_process').css({'width':percent+'%'});  
  56.     }  
  57. };  
  58.   
  59. /** 
  60.  * 选择文件后回调上传。 
  61.  */  
  62. function uploadFile(fileURI) {  
  63.     var options = new FileUploadOptions();  
  64.     options.fileKey = "file";  
  65.     options.fileName = fileURI.substr(fileURI.lastIndexOf('/') + 1);  
  66.     options.mimeType = "multipart/form-data";  
  67.     options.chunkedMode = false;  
  68.     ft = new FileTransfer();  
  69.     var uploadUrl=encodeURI("http://192.168.1.170:8080/forum/upload/upload-file.html?t=1");  
  70.     ft.upload(fileURI,uploadUrl,uploadSuccess, uploadFailed, options);  
  71.     //获取上传进度  
  72.     ft.onprogress = uploadProcessing;  
  73.     //显示进度条  
  74.     $('.upload_process_bar,#process_info').show();  
  75. }  
  76.   
  77. /** 
  78.  * 上传成功回调. 
  79.  * @param r 
  80.  */  
  81. function uploadSuccess(r) {  
  82.     alert('文件上传成功:'+r.response);  
  83.     clearProcess();  
  84. }  
  85.   
  86. /** 
  87.  * 上传失败回调. 
  88.  * @param error 
  89.  */  
  90. function uploadFailed(error) {  
  91.     alert('上传失败了。');  
  92.     clearProcess();  
  93. }  
  94.   
  95. /** 
  96.  * 页面实例化回调. 
  97.  */  
  98. document.addEventListener("deviceready"function(){  
  99.     $(function(){  
  100.          $('#upload_file_link').click(openFileSelector);  
  101.     });  
  102. }, false);  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值