`
czpae86
  • 浏览: 720508 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

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>

 

  • 大小: 58.2 KB
  • 大小: 66.1 KB
  • 大小: 57.7 KB
分享到:
评论
5 楼 xu_miao 2014-06-17  
youtops 写道
为什么我的界面点击下载总是提示 Class not found
类找不到

 
我的也是   你解决了么?
4 楼 flyong86 2013-06-08  
我现在下载文件可以正常下载和监听进度,但是问题在于程序下载的同时用户去其它页面后程序在后台执行,但是不会再执行我的进度监听,完成监听的js回调方法

这是一件很痛苦的事情,通常我这里下载的文件比较大比如10M的zip,用户点了下载去其它页面,我在下载完成后会解压文件,但下载完成后就再也不会执行做解压的js(自己写的插件)

你是否也这样呢
3 楼 czpae86 2013-05-23  
_莎士比亚的梦 写道
请问一下你那个downloader.js是那里的js文件,那里可以得到


就是上面的js内容
2 楼 _莎士比亚的梦 2013-05-22  
请问一下你那个downloader.js是那里的js文件,那里可以得到
1 楼 youtops 2013-05-09  
为什么我的界面点击下载总是提示 Class not found
类找不到

相关推荐

    phonegap 3.4实现下载功能

    开发者可以创建、读取、修改和删除文件,这对于实现文件下载至关重要。 2. **FileTransfer对象**:PhoneGap提供了FileTransfer对象,用于上传和下载文件。通过这个对象,开发者可以指定源URL、目标文件路径,以及...

    使用PhoneGap实现离线功能【技术文档】

    《使用PhoneGap实现离线功能的技术探索》 PhoneGap,一个强大的跨平台移动应用开发框架,以其独特的HTML、CSS和JavaScript技术,让开发者能够轻松构建原生移动应用。在许多情况下,尤其是对于那些需要在无网络环境...

    phoneGap实现android平台登录例子

    在这个“phoneGap实现android平台登录例子”中,我们将探讨如何利用PhoneGap在Android平台上创建一个简单的登录功能,这对于初学者来说是一个很好的入门实践。 首先,我们需要了解PhoneGap的基础知识。PhoneGap是...

    PhoneGap Demo下载.rar

    这个"PhoneGap Demo下载.rar"文件很显然是一个包含了基础PhoneGap开发示例的压缩包,对于初学者或者遇到环境配置问题的开发者来说,这是一个很好的学习资源。 PhoneGap的核心是基于Apache Cordova,它提供了设备API...

    Phonegap拍照,图片保存应用

    5. **保存图片到应用目录**:PhoneGap提供`File`和`FileTransfer`对象,用于处理文件操作。你可以使用`window.resolveLocalFileSystemURL`获取到图片的文件对象,然后使用`FileWriter`写入到应用的私有目录。这样,...

    phonegap录音以及上传下载

    PhoneGap提供了FileTransfer对象,通过这个对象可以实现文件从本地设备到远程服务器的上传。首先,开发者需要获取到录音文件的URI,然后使用FileTransfer对象的upload方法,指定URL、文件URI、HTTP方法(通常是POST...

    phonegap实现摇一摇打电话

    在这个特定的场景中,我们要探讨的是如何在PhoneGap 3.0版本上实现“摇一摇”功能来拨打电话。 首先,我们要理解PhoneGap的核心原理:通过WebView将Web应用包装成原生的移动应用,利用JavaScript接口调用设备的API...

    IONIC+PhoneGap项目源码

    1. "深入浅出 phonegap 代码.zip" - 这个文件可能是关于PhoneGap的教程或者示例代码,包含了深入讲解PhoneGap使用方法的代码示例,可以帮助初学者理解PhoneGap的工作原理和实践应用。 2. "ionic-1.1.zip" - 这是...

    phonegap完整例子!

    "是针对Android平台的一个示例项目,特别适合在pad设备上运行,并且包含了自定义插件的实现,这对于深入理解和使用PhoneGap技术尤其有帮助。 1. **PhoneGap基础概念** - PhoneGap基于Apache Cordova,是一个让...

    phoneGap的写入文件

    总的来说,PhoneGap提供了一个方便的接口来实现跨平台的文件操作,让Web开发者能够利用熟悉的Web技术来开发具有文件操作功能的移动应用。在实际开发中,应确保遵循各平台的文件系统规范和权限管理,以及处理可能出现...

    phoneGAP2.9.1.zip

    然后,下载并解压"phonegap-2.9.1"文件,通过命令行工具进行初始化,创建新项目,并配置相应的平台。 4. **开发流程:** - 创建一个基本的HTML5应用结构,包含必要的JavaScript和CSS。 - 使用PhoneGap CLI或配置...

    phoneGap实现android平台应用

    本教程将详细介绍如何使用PhoneGap在Android平台上实现一个新闻客户端,同时连接到MySQL数据库。 首先,我们需要了解PhoneGap的核心概念。PhoneGap提供了一种封装机制,将Web应用程序打包为原生应用,利用WebView...

    phoneGap实现android程序开发代码

    在这个“phoneGap实现android程序开发代码”中,我们将探讨如何使用PhoneGap进行Android应用开发。 首先,我们需要安装PhoneGap的开发环境。这包括安装Java Development Kit (JDK),Android SDK,以及集成开发环境...

    自定义plugin插件实现phonegap与Android交互

    在"自定义plugin插件实现phonegap与Android交互"这个主题中,我们主要关注的是如何通过编写自定义插件来打通JavaScript和Android之间的通信壁垒。在PhoneGap中,Plugin是连接Web层和Native层的桥梁,它们是用Java...

    phonegap 源码 下载

    PhoneGap 是一个开源框架...总的来说,下载并研究 PhoneGap 的 Android 源代码,可以加深对 PhoneGap 工作机制的理解,提高开发效率,同时为定制化开发打开新的可能。无论是初学者还是经验丰富的开发者,都能从中获益。

    phonegap 桌面版6.3.0

    2. **安装PhoneGap Desktop App**:下载并运行提供的PhoneGapSetup-win32-630.exe文件,按照向导完成安装。 3. **创建项目**:启动PhoneGap Desktop App后,通过“新建”按钮创建一个新的项目,填写项目名和ID,...

    phonegap源码+示例

    6. **配置文件**:如`config.xml`是PhoneGap项目的核心配置文件,它定义了应用的元数据、允许使用的API和加载的插件。深入研究这些配置文件,可以更好地控制应用的行为。 7. **性能优化**:Cordova2.9时代的Web技术...

    phonegap开发示例服务器端开发

    5. 安装PhoneGap:PhoneGap的安装通常涉及到下载PhoneGap库,然后在Eclipse中配置相应的构建路径。 在搭建好环境后,开发者可以创建一个基于Android平台的PhoneGap项目。这通常涉及以下过程: 1. 创建一个新的...

    使用Phonegap实现离线功能详细讲解.doc

    总结来说,PhoneGap 结合 SQLite 实现离线功能的技术流程主要包括:构建 PhoneGap 环境,通过 AJAX 获取并解析 JSON 数据,使用 PhoneGap 的 SQLite API 存储数据,以及在离线状态下从数据库中读取数据并更新 UI。...

    最新phonegap插件集合

    PhoneGap的核心理念是通过Web技术实现多平台的兼容性,将网页应用转换为能够在iOS、Android、Windows Phone等平台上运行的原生应用。这个“最新phonegap插件集合”应该是包含了一系列适用于PhoneGap开发的最新插件,...

Global site tag (gtag.js) - Google Analytics