How to download files from UIWebView and open again

30,569

Use the method - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType in your UiWebView's delegate to determine when it wants to load resource.

When the method get's called, you just need to parse the URL from the parameter (NSURLRequest *)request, and return NO if it's one of your desired type and continue with your logic (UIActionSheet) or return YES if the user just clicked a simple link to a HTML file.

Makes sense?

Edit_: For better understanding a quick code example

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
     if(navigationType == UIWebViewNavigationTypeLinkClicked) {
          NSURL *requestedURL = [request URL];
          // ...Check if the URL points to a file you're looking for...
          // Then load the file
          NSData *fileData = [[NSData alloc] initWithContentsOfURL:requestedURL;
          // Get the path to the App's Documents directory
          NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
          NSString *documentsDirectory = [paths objectAtIndex:0]; // Get documents folder
          [fileData writeToFile:[NSString stringWithFormat:@"%@/%@", documentsDirectory, [requestedURL lastPathComponent]] atomically:YES];
     } 
}

Edit2_: I've updated the code sample after our dicussion about your issues in the chat:

- (IBAction)saveFile:(id)sender {
    // Get the URL of the loaded ressource
    NSURL *theRessourcesURL = [[webView request] URL];
    NSString *fileExtension = [theRessourcesURL pathExtension];

    if ([fileExtension isEqualToString:@"png"] || [fileExtension isEqualToString:@"jpg"]) {
        // Get the filename of the loaded ressource form the UIWebView's request URL
        NSString *filename = [theRessourcesURL lastPathComponent];
        NSLog(@"Filename: %@", filename);
        // Get the path to the App's Documents directory
        NSString *docPath = [self documentsDirectoryPath];
        // Combine the filename and the path to the documents dir into the full path
        NSString *pathToDownloadTo = [NSString stringWithFormat:@"%@/%@", docPath, filename];


        // Load the file from the remote server
        NSData *tmp = [NSData dataWithContentsOfURL:theRessourcesURL];
        // Save the loaded data if loaded successfully
        if (tmp != nil) {
            NSError *error = nil;
            // Write the contents of our tmp object into a file
            [tmp writeToFile:pathToDownloadTo options:NSDataWritingAtomic error:&error];
            if (error != nil) {
                NSLog(@"Failed to save the file: %@", [error description]);
            } else {
                // Display an UIAlertView that shows the users we saved the file :)
                UIAlertView *filenameAlert = [[UIAlertView alloc] initWithTitle:@"File saved" message:[NSString stringWithFormat:@"The file %@ has been saved.", filename] delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
                [filenameAlert show];
                [filenameAlert release];
            }
        } else {
            // File could notbe loaded -> handle errors
        }
    } else {
        // File type not supported
    }
}

/**
    Just a small helper function
    that returns the path to our 
    Documents directory
**/
- (NSString *)documentsDirectoryPath {
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectoryPath = [paths objectAtIndex:0];
    return documentsDirectoryPath;
}
Share:
30,569
pixelbitlabs
Author by

pixelbitlabs

PixelBit Apps iOS Design and Development at http://www.pixelbitapps.com

Updated on December 30, 2020

Comments

  • pixelbitlabs
    pixelbitlabs over 3 years

    How can I create a "download manager" which would detect when a link you tap (in a UIWebView) has the file ending ".pdf", ".png", ".jpeg", ".tiff", ".gif", ".doc", ".docx", ".ppt", ".pptx", ".xls" and ".xlsx" and then would open a UIActionSheet asking you if you would like to download or open. If you select download, it will then download that file to the device.

    Another section of the app would have a list of downloaded files in a UITableView and when you tap on them, they will show in a UIWebView, but of course offline because they would load locally as they would have been downloaded.

    See http://itunes.apple.com/gb/app/downloads-lite-downloader/id349275540?mt=8 for a better understanding of what I am trying to do.

    What is the best way of doing this?

  • Björn Kaiser
    Björn Kaiser over 12 years
    When you habe the ressources URL just use a NSURLRequest to download that file and Save it locally. Search here on SO or Google, there are plenty of Tutorials :)
  • pixelbitlabs
    pixelbitlabs over 12 years
    I've searched loads but can't find anything saying how to download files from the UIWebView locally :(
  • Björn Kaiser
    Björn Kaiser over 12 years
    Because you don't download a file from a UIWebView, you download a file from an URL. You can get the URL from the request parameter of the method I mentioned in my answer.
  • pixelbitlabs
    pixelbitlabs over 12 years
    Ok, so how would I "use a NSURLConnection to download the file"? :-)
  • Björn Kaiser
    Björn Kaiser over 12 years
    The documentation is your friend ;-) developer.apple.com/library/ios/#documentation/Cocoa/Concept‌​ual/…. In the "- (void)connectionDidFinishLoading:(NSURLConnection *)connection" method you can use NSData's "writeToFile" method, to write save the loaded data into a file in your App's Documents directory. Let me know if you need further assistance
  • Björn Kaiser
    Björn Kaiser over 12 years
  • Cathy
    Cathy over 12 years
    I needed the same code and this code was very helpful..Thanks Bjorn
  • zonabi
    zonabi almost 10 years
    Please correct me if i am wrong, but this doesn't stop you from having to re-download the resourceURL again for saving, in addition to the initial downloading when you presented the webview. Is there a way to load a webview, and then GRAB the resource in that webview without having to download it again?
  • Dory
    Dory over 7 years
    Please help me, i am stuck in this logic. If a file is viewable in webview i am showing preview. and if a url having example video which is not viewable in webview i want to download. is it possible to do?