如何从Internet下载docx,pdf,image,pptx或任何文件

时间:2011-09-14 18:00:36

标签: iphone objective-c ipad

如何从要求提供身份验证凭据的站点下载docx,pdf,image,pptx或任何文件我尝试传递凭据并且nsdata中的数据仍然是其他内容,但它存储了保留本地创建的文件可以任何人都可以帮助下载任何类型的文件。

代码如下: 在这个buttonClicked中从其他文件中调用 DownloadingFile.h

    #import "MyAppDelegate.h"

@interface DownloadingFile : NSObject
{
    NSMutableData *webData;
    NSMutableString *soapResults;
    NSURLConnection *conn;
    BOOL *elementFound; 
    BOOL isDoneParsing;
    MyAppDelegate *mydelegate;

    NSString *userCd,*passWord,*siteUrl;

}
@property (nonatomic ,retain) MyAppDelegate *mydelegate;
-(void)buttonClicked;
-(bool)getIsDone;
@end

DownloadingFile.m

#import "DownloadingFile.h"
#import "iExploreAppDelegate.h"

@implementation DownloadingFile

@synthesize mydelegate;

- (void)buttonClicked
{
    mydelegate=(MyAppDelegate *)[[UIApplication sharedApplication] delegate];

    userCd=[[NSString alloc] initWithString:[mydelegate getUserId]];
    passWord=[[NSString alloc] initWithString:[mydelegate getPassword]];

    NSLog(@"In Downloading; ");

    NSURL *url =[NSURL URLWithString:[@"http://abcdef.xyz.com/Docs/NewFolder/myFile.docx" stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];

    NSMutableURLRequest *req = [NSMutableURLRequest requestWithURL:url];
        [req setValue:[NSString stringWithFormat:@"bytes=%ld-",0] forHTTPHeaderField:@"Range"];
        [req addValue: @"docx" forHTTPHeaderField:@"Content-Type"];
        [req setHTTPMethod:@"POST"];

      //---set the headers---
   conn = [[NSURLConnection alloc] initWithRequest:req delegate:self startImmediately:YES];

    if (conn) {
        NSLog(@"connection done ");

       webData = [[NSMutableData data] init];
    }   
} 


-(void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge {
    if([challenge previousFailureCount] == 0) {
        NSURLCredential *newCredential;

      newCredential=[NSURLCredential credentialWithUser:userCd password:passWord persistence:NSURLCredentialPersistenceNone];
      NSLog(@"Crediantials done ");
        [[challenge sender] useCredential:newCredential forAuthenticationChallenge:challenge];
    } else {
        [[challenge sender] cancelAuthenticationChallenge:challenge];
        NSError* error = [NSError errorWithDomain:@"SoapRequest" code:403 userInfo: [NSDictionary dictionaryWithObjectsAndKeys: @"Could not authenticate this request", NSLocalizedDescriptionKey,nil]];
        NSLog(@"Credentials are not valid");
        [mydelegate loginFailled:false];
    }
}



-(void) connection:(NSURLConnection *) connection 
didReceiveResponse:(NSURLResponse *) response {
    //[webData setLength: 0];
}

-(void) connection:(NSURLConnection *) connection 
    didReceiveData:(NSData *) data {
    NSLog(@"recevied data %@",data);
    webData=[NSMutableData dataWithData:data];
    [webData appendData:data];
}

-(void) connection:(NSURLConnection *) connection 
  didFailWithError:(NSError *) error {
    [webData release];
    [connection release];
}
-(void) connectionDidFinishLoading:(NSURLConnection *) connection {

    NSLog(@"Did Finish Loading done ");

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

    NSString *documentsDirectory = [paths objectAtIndex:0];

    NSString *pdfPath = [documentsDirectory stringByAppendingPathComponent:@"FileName.docx"];

    [webData writeToFile:pdfPath atomically:YES];

    [connection release];

}

2 个答案:

答案 0 :(得分:3)

我刚刚编写了一个快速应用程序来测试使用Apple的NSURLConnection,这是一个简单而强大的解决方案。我下载了几百KB的Word和PowerPoint文件。对于身份验证,我使用.htaccess。奇迹般有效。这是相关的代码。

- (IBAction)clickedDownload:(id)sender {
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://myserver.com/downloadTest/testfile.pptx"]];
    NSURLConnection *connection = [NSURLConnection connectionWithRequest:request delegate:self];
    [connection start];
}

-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
   // inform the user
}

-(void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge {
    if ([challenge previousFailureCount] == 0) {        
        NSURLCredential *newCredential;
        newCredential = [NSURLCredential credentialWithUser:@"theUsername"
                                                   password:@"thePassword"
                                                persistence:NSURLCredentialPersistenceNone];
        [[challenge sender] useCredential:newCredential
               forAuthenticationChallenge:challenge];
    } else {
        [[challenge sender] cancelAuthenticationChallenge:challenge];
        // inform the user that password is incorrect
    }
}

-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
    receivedData = [[NSMutableData alloc] init];
}

-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
    [receivedData appendData:data]; 
}

-(void)connectionDidFinishLoading:(NSURLConnection *)connection {
    NSURL *docDirectory = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
    NSURL *filePath = [docDirectory URLByAppendingPathComponent:@"testfile.pptx"];
    [receivedData writeToURL:filePath atomically:YES];
    [receivedData release];
    connection = nil;
}

现在我打开〜/ Library / Application Support / iPhone Simulator / 4.3.2 / Applications / [unique-application-code] / Documents 中的文件 - 效果很好!

答案 1 :(得分:0)

您应该查看ASIHTTPRequest。 http://allseeing-i.com/ASIHTTPRequest/How-to-use

NSURL *url = [NSURL URLWithString:@"http://abcdef.xyz.com/Docs/NewFolder/myFile.docx"];
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setUsername:@"username"];
[request setPassword:@"password"];
[request setDidFinishSelector:@selector(requestDone:)];
[request setDidFailSelector:@selector(requestWentWrong:)];

- (void)requestDone:(ASIHTTPRequest *)request
{
   NSString *response = [request responseString];
}

- (void)requestWentWrong:(ASIHTTPRequest *)request
{
   NSError *error = [request error];
}