ios 如何从 UIWebView 下载文件并再次打开

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/7377565/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-30 21:27:43  来源:igfitidea点击:

How to download files from UIWebView and open again

iosiphonedownloaduiwebview

提问by pixelbitlabs

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.

如何创建一个“下载管理器”来检测您点击的链接(在 UIWebView 中)何时具有以“.pdf”、“.png”、“.jpeg”、“.tiff”、“.gif”结尾的文件、“.doc”、“.docx”、“.ppt”、“.pptx”、“.xls”和“.xlsx”,然后会打开一个 UIActionSheet,询问您是否要下载或打开。如果您选择下载,它将将该文件下载到设备。

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.

应用程序的另一部分将在 UITableView 中包含已下载文件的列表,当您点击它们时,它们将显示在 UIWebView 中,但当然是离线的,因为它们会像下载时一样在本地加载。

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

请参阅http://itunes.apple.com/gb/app/downloads-lite-downloader/id349275540?mt=8以更好地了解我正在尝试做什么。

What is the best way of doing this?

这样做的最佳方法是什么?

回答by Bj?rn Kaiser

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

使用- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType您的 UiWebView 委托中的方法来确定它想要加载资源的时间。

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.

当方法 get 被调用时,您只需要从参数中解析 URL (NSURLRequest *)request,如果它是您想要的类型之一,则返回 NO 并继续您的逻辑(UIActionSheet),或者如果用户只是单击一个指向 HTML 文件的简单链接,则返回 YES .

Makes sense?

说得通?

Edit_: For better understanding a quick code example

Edit_:为了更好地理解快速代码示例

- (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:

Edit2_:在我们在聊天中讨论您的问题后,我更新了代码示例:

- (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;
}