2011-09-14 16 views
0

認証用の資格情報を要求するサイトからdocx、pdf、image、pptx、または任意のファイルをダウンロードするにはどうすればよいですか? nsdataのデータは何か他のものですが、ローカルに作成されたファイルを保存することができますので、誰でもファイルのダウンロードを助けることができます。次のようにインターネットからdocx、pdf、image、pptx、または任意のファイルをダウンロードするには

コードは次のとおりです。他のファイル 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]; 

} 

答えて

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

は、今私は〜/ライブラリ/ Application Support/iPhoneシミュレータ/ 4.3.2 /アプリケーション/ [ユニークなアプリケーションコード] /書類内のファイルがオープン!

+0

ありがとう、それは私のために素晴らしい作品です! –

0

あなたがASIHTTPRequestになっているはずですから呼び出されたこのbuttonClickedで 。 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]; 
} 
関連する問題