phonegap 实现文件下载

phonegap 文件下载

效果图:


phonegap 实现文件下载
 
phonegap 实现文件下载
 
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>

相关推荐