PhoneGap Plugin for downloading URL - All The Code
Have you considered using Appcelerator for your project? File downloads are pretty straightforward plus there are plenty more advantages to running a NATIVE app versus running your app in a web client. Contact us for more information on Appcelerator and why it is the platform we use for all solutions.
See the reasons why I don't recommend PhoneGap, Appcelerator is the better solution
Complete Project Posted here on GitHub
https://github.com/aaronksaunders/FileDownLoadApp
I created a post a few months ago when I first started playing with PhoneGap and it has gotten alot of hits. I never posted ALL of the code and I have gotten alot of requests for it so here it is, enjoy!!
And I am looking for some consulting work if there are any openings out there, let me know
// // PixFileDownload.h // FileDownLoadApp // // Created by Aaron saunders on 9/8/10. // #import <Foundation/Foundation.h> #import "PhoneGapCommand.h" @interface PixFileDownload : PhoneGapCommand { NSMutableArray* params; } -(void) downloadFile:(NSMutableArray*)paramArray withDict:(NSMutableDictionary*)options; -(void) downloadComplete; -(void) downloadFileFromUrlInBackgroundTask:(NSMutableArray*)paramArray; -(void) downloadFileFromUrl:(NSMutableArray*)paramArray; @end
// // PixFileDownload.m // FileDownLoadApp // // Created by Aaron Saunders on 9/8/10. // #import "PixFileDownload.h" @implementation PixFileDownload -(PhoneGapCommand*) initWithWebView:(UIWebView*)theWebView { self = (PixFileDownload*)[super initWithWebView:theWebView]; return self; } // // entry point to the javascript plugin for PhoneGap // -(void) downloadFile:(NSMutableArray*)paramArray withDict:(NSMutableDictionary*)options { NSLog(@"in PixFileDownload.downloadFile",nil); NSString * sourceUrl = [paramArray objectAtIndex:0]; NSString * fileName = [paramArray objectAtIndex:1]; //NSString * completionCallback = [paramArray objectAtIndex:2]; params = [[NSMutableArray alloc] initWithCapacity:2]; [params addObject:sourceUrl]; [params addObject:fileName]; [self downloadFileFromUrl:params]; } // // call to excute the download in a background thread // -(void) downloadFileFromUrl:(NSMutableArray*)paramArray { NSLog(@"in PixFileDownload.downloadFileFromUrl",nil); [self performSelectorInBackground: @selector( downloadFileFromUrlInBackgroundTask ) withObject: paramArray waitUntilDone:NO]; } // // downloads the file in the background and saves it to the local documents // directory for the application // -(void) downloadFileFromUrlInBackgroundTask:(NSMutableArray*)paramArray { NSLog(@"in PixFileDownload.downloadFileFromUrlInBackgroundTask",nil); NSString * sourceUrl = [paramArray objectAtIndex:0]; NSString * fileName = [paramArray objectAtIndex:1]; NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; NSData* theData = [NSData dataWithContentsOfURL: [NSURL URLWithString:sourceUrl] ]; // save file in documents directory NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [paths objectAtIndex:0]; NSString *newFilePath = [documentsDirectory stringByAppendingString:fileName]; NSFileManager *fileManager=[NSFileManager defaultManager]; NSError *error=[[[NSError alloc]init] autorelease]; BOOL response = [theData writeToFile:newFilePath options:NSDataWritingFileProtectionNone error:&error]; NSLog(@"file save result %@", response); // send our results back to the main thread [self performSelectorOnMainThread:@selector(downloadComplete:) withObject:nil waitUntilDone:NO]; [pool drain]; } // // calls the predefined callback in the ui to indicate completion // -(void) downloadComplete { NSLog(@"in PixFileDownload.downloadComplete",nil); NSString * jsCallBack = [NSString stringWithFormat:@"pixFileDownloadComplete('%@');",@"return message to ui"]; [webView stringByEvaluatingJavaScriptFromString:jsCallBack]; } - (void)dealloc { if (params) { [params release]; } [super dealloc]; } @end
// // pixFileDownload.js // FileDownLoadApp // // Created by Aaron saunders on 9/8/10. // function PixFileDownload() { } PixFileDownload.prototype.downloadFile = function(url,destFileName) { PhoneGap.exec("PixFileDownload.downloadFile", url,destFileName); }; PhoneGap.addConstructor(function() { window.fileDownloadMgr = new PixFileDownload(); });
here is how you use the code in the HTML file
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <!-- Change this if you want to allow scaling --> <meta name="viewport" content="width=default-width; user-scalable=no" /> <meta http-equiv="Content-type" content="text/html; charset=utf-8"> <title>FileDownLoadApp</title> <!-- iPad/iPhone specific css below, add after your main css > <link rel="stylesheet" media="only screen and (max-device-width: 1024px)" href="ipad.css" type="text/css" /> <link rel="stylesheet" media="only screen and (max-device-width: 480px)" href="iphone.css" type="text/css" /> --> <script type="text/javascript" charset="utf-8" src="phonegap.js"></script> <script type="text/javascript" charset="utf-8" src="pixFileDownload.js"></script> <script type="text/javascript" charset="utf-8"> // If you want to prevent dragging, uncomment this section /* function preventBehavior(e) { e.preventDefault(); }; document.addEventListener("touchmove", preventBehavior, false); */ function onBodyLoad() { document.addEventListener("deviceready",onDeviceReady,false); } /* When this function is called, PhoneGap has been initialized and is ready to roll */ function onDeviceReady() { // do your thing! fileDownloadMgr.downloadFile("http://www.cnn.com","test.html"); } </script> </head> <body onload="onBodyLoad()"> </body> </html>