phonegap 文件下载
效果图:
package com.phonegap.plugins.downloader; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; import org.apache.cordova.api.Plugin; import org.apache.cordova.api.PluginResult; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import android.os.Environment; import android.util.Log; public class Downloader extends Plugin { @Override public PluginResult execute(String action, JSONArray args, String callbackId) { if (!action.equals("downloadFile")) return new PluginResult(PluginResult.Status.INVALID_ACTION); try { String fileUrl = args.getString(0); JSONObject params = args.getJSONObject(1); String fileName = params.has("fileName") ? params .getString("fileName") : fileUrl.substring(fileUrl .lastIndexOf("/") + 1); String dirName = params.has("dirName") ? params .getString("dirName") : Environment .getExternalStorageDirectory().getPath() + "/download"; Boolean overwrite = params.has("overwrite") ? params .getBoolean("overwrite") : false; return this.downloadUrl(fileUrl, dirName, fileName, overwrite, callbackId); } catch (JSONException e) { e.printStackTrace(); return new PluginResult(PluginResult.Status.JSON_EXCEPTION, e.getMessage()); } catch (InterruptedException e) { e.printStackTrace(); return new PluginResult(PluginResult.Status.ERROR, e.getMessage()); } } private PluginResult downloadUrl(String fileUrl, String dirName, String fileName, Boolean overwrite, String callbackId) throws InterruptedException, JSONException { try { Log.d("PhoneGapLog", "Downloading " + fileUrl + " into " + dirName + "/" + fileName); File dir = new File(dirName); if (!dir.exists()) { Log.d("PhoneGapLog", "directory " + dirName + " created"); dir.mkdirs(); } File file = new File(dirName, fileName); if (!overwrite && file.exists()) { Log.d("DownloaderPlugin", "File already exist"); JSONObject obj = new JSONObject(); obj.put("status", 1); obj.put("total", 0); obj.put("file", fileName); obj.put("dir", dirName); obj.put("progress", 100); return new PluginResult(PluginResult.Status.OK, obj); } URL url = new URL(fileUrl); HttpURLConnection ucon = (HttpURLConnection) url.openConnection(); ucon.setRequestMethod("GET"); ucon.connect(); Log.d("PhoneGapLog", "Download start"); InputStream is = ucon.getInputStream(); byte[] buffer = new byte[1024]; int readed = 0, progress = 0, totalReaded = 0, fileSize = ucon .getContentLength(); FileOutputStream fos = new FileOutputStream(file); while ((readed = is.read(buffer)) > 0) { fos.write(buffer, 0, readed); totalReaded += readed; int newProgress = (int) (totalReaded * 100 / fileSize); if (newProgress != progress) progress = informProgress(fileSize, newProgress, dirName, fileName, callbackId); } fos.close(); Log.d("PhoneGapLog", "Download finished"); JSONObject obj = new JSONObject(); obj.put("status", 1); obj.put("total", fileSize); obj.put("file", fileName); obj.put("dir", dirName); obj.put("progress", progress); return new PluginResult(PluginResult.Status.OK, obj); } catch (FileNotFoundException e) { Log.d("PhoneGapLog", "File Not Found: " + e); return new PluginResult(PluginResult.Status.ERROR, 404); } catch (IOException e) { Log.d("PhoneGapLog", "Error: " + e); return new PluginResult(PluginResult.Status.ERROR, e.getMessage()); } } private int informProgress(int fileSize, int progress, String dirName, String fileName, String callbackId) throws InterruptedException, JSONException { JSONObject obj = new JSONObject(); obj.put("status", 0); obj.put("total", fileSize); obj.put("file", fileName); obj.put("dir", dirName); obj.put("progress", progress); PluginResult res = new PluginResult(PluginResult.Status.OK, obj); res.setKeepCallback(true); success(res, callbackId); // Give a chance for the progress to be sent to javascript Thread.sleep(100); return progress; } }
function Downloader() { } Downloader.prototype.downloadFile = function(fileUrl, params, win, fail) { // Make params hash optional. if (!fail) win = params; cordova.exec(win, fail, "Downloader", "downloadFile", [ fileUrl, params ]); }; window.downloader = new Downloader();
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <meta name="format-detection" content="telephone=no" /> <meta name="viewport" content="user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1, width=device-width, height=device-height, target-densitydpi=device-dpi" /> <link rel="stylesheet" type="text/css" href="css/jquerymobile/themes/default/jquery.mobile-1.2.0.min.css" /> <link rel="stylesheet" href="css/style.css" /> <title>PhonegapTest</title> </head> <body> <div data-role="page"> <h3>phonegap 文件下载测试</h3> <div style="padding:20%;"> <img src="#" id="img_001" style="width:150px;height:150px;border:1px solid #ccc;"/> </div> <div>progress:<span id="test_002"></span>%</div> <a data-role="button" id="downloadBtn">download</a> </div> <script type="text/javascript" src="js/cordova-2.2.0.js"></script> <script type="text/javascript" src="js/jquery-1.8.2.min.js"></script> <script type="text/javascript" src="js/jquery.mobile-1.2.0.min.js"></script> <script type="text/javascript" src="js/downloader.js"></script> <script type="text/javascript"> $('#downloadBtn').bind('click',function(){ $('#img_001').attr('src','#'); window.downloader.downloadFile("http://7676.gmcc.net/images/newportal/bnt_tb01b.gif", {overwrite: true}, function(res) { //alert(JSON.stringify(res)); $('#test_002').text(res.progress); if(res.progress==100){ $('#img_001').attr('src',res.dir+'/'+res.file); } }, function(error) { alert(error); } ); }); </script> </body> </html>