2013-04-25 45 views
4

我是iOS新手。我如何上傳/下載文件到/到Dropbox?我在我的應用程序中集成了Dropbox應用程序,但我無法上傳/下載文件。如何使用xcode將文件上傳/下載到Dropbox

這是我上傳的代碼:

- (NSString *)getDocumentPath 
{ 
    NSMutableData * pdfData = [NSMutableData data]; 
    UIGraphicsBeginPDFContextToData(pdfData, self.view.bounds, nil); 
    UIGraphicsBeginPDFPage(); 
    CGContextRef pdfContext = UIGraphicsGetCurrentContext(); 
    [self.view.layer renderInContext:pdfContext]; 
    UIGraphicsEndPDFContext(); 

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

    NSString *path = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"vani.doc"]; 

    [pdfData writeToFile:path atomically:YES]; 

    return path; 

} 

- (IBAction)upload:(id)sender { 

    NSString *path = [self getDocumentPath]; 

    NSString * local = [path lastPathComponent]; 

    NSString *destDir = @"/Plist Folder/vani.doc"; 

    [restClient uploadFile:local toPath:destDir withParentRev:nil fromPath:path]; 

這是一個下載:

restClient = [[DBRestClient alloc] initWithSession:[DBSession sharedSession]]; 
    restClient.delegate = self; 
    NSString *fileName = [NSString stringWithFormat:@"/vani.doc"]; 

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, 
                 NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 

    NSString* path2 = [documentsDirectory stringByAppendingString: 
         [NSString stringWithFormat:@"%@", fileName]]; 
    //NSLog(@"%@", path2); 

    [restClient loadFile:fileName intoPath:path2]; 

請幫助我。我很困擾。

+2

問題是什麼?混亂的原因?錯誤日誌? – 2013-04-25 10:18:27

+0

其實..在Dropbox應用程序中遇到問題。 – 2013-04-25 10:34:45

+0

iam試圖上傳和下載文件.. bt我couldn .. – 2013-04-25 10:39:35

回答

5

讓我來幫助你,在這種情況下,我創建了Dropbox類,用於我的項目之一中使用的Dropbox查找代碼。 它不支持ARC。創建DropBoxManager標頭和實現文件 如果您是初學者,這對您來說可能太多了,但是嘗試閱讀整個答案並按照步驟進行操作。如有任何問題,請告知我,我會幫忙。

代碼DropBoxManager.h

#import <Foundation/Foundation.h> 
#import <DropboxSDK/DropboxSDK.h> 

#define kDropbox_AppKey @"" // Provide your key here 
#define kDropbox_AppSecret @"" // Provide your secret key here 
#define kDropbox_RootFolder kDBRootDropbox //Decide level access like root or app 

@protocol DropBoxDelegate; 

typedef enum 
{ 
    DropBoxTypeStatusNone = 0, 
    DropBoxGetAccountInfo = 1, 
    DropBoxGetFolderList = 2, 
    DropBoxCreateFolder = 3, 
    DropBoxUploadFile = 4 
} DropBoxPostType; 

@interface DropboxManager : NSObject <DBRestClientDelegate,DBSessionDelegate,UIAlertViewDelegate> 
{ 
    UIViewController<DropBoxDelegate> *apiCallDelegate; 

    DBSession *objDBSession; 
    NSString *relinkUserId; 
    DBRestClient *objRestClient; 

    DropBoxPostType currentPostType; 

    NSString *strFileName; 
    NSString *strFilePath; 
    NSString *strDestDirectory; 
    NSString *strFolderCreate; 
    NSString *strFolderToList; 
} 

@property (nonatomic,retain) DBSession *objDBSession; 
@property (nonatomic,retain) NSString *relinkUserId; 

@property (nonatomic,assign) UIViewController<DropBoxDelegate> *apiCallDelegate; 

@property (nonatomic,retain) DBRestClient *objRestClient; 

@property (nonatomic,assign) DropBoxPostType currentPostType; 

@property (nonatomic,retain) NSString *strFileName; 
@property (nonatomic,retain) NSString *strFilePath; 
@property (nonatomic,retain) NSString *strDestDirectory; 

@property (nonatomic,retain) NSString *strFolderCreate; 

@property (nonatomic,retain) NSString *strFolderToList; 

//Singleton 
+(id)dropBoxManager; 

//Initialize dropbox 
-(void)initDropbox; 

//Authentication Verification 
-(BOOL)handledURL:(NSURL*)url; 
-(void)dropboxDidLogin; 
-(void)dropboxDidNotLogin; 

//Upload file 
-(void)uploadFile; 

//Download File 
-(void)downlaodFileFromSourcePath:(NSString*)pstrSourcePath destinationPath:(NSString*)toPath; 

//Create Folder 
-(void)createFolder; 

//Get Account Information 
-(void)loginToDropbox; 
-(void)logoutFromDropbox; 
-(BOOL)isLoggedIn; 

//List Folders 
-(void)listFolders; 

@end 

@protocol DropBoxDelegate <NSObject> 

@optional 

- (void)finishedLogin:(NSMutableDictionary*)userInfo; 
- (void)failedToLogin:(NSString*)withMessage; 

- (void)finishedCreateFolder; 
- (void)failedToCreateFolder:(NSString*)withMessage; 

- (void)finishedUploadFile; 
- (void)failedToUploadFile:(NSString*)withMessage; 

- (void)finishedDownloadFile; 
- (void)failedToDownloadFile:(NSString*)withMessage; 

- (void)getFolderContentFinished:(DBMetadata*)metadata; 
- (void)getFolderContentFailed:(NSString*)withMessage; 

@end 

代碼DropBoxManager.m

#import "DropboxManager.h" 

@implementation DropboxManager 

@synthesize objDBSession,relinkUserId,apiCallDelegate; 
@synthesize objRestClient; 
@synthesize currentPostType; 

@synthesize strFileName; 
@synthesize strFilePath; 
@synthesize strDestDirectory; 

@synthesize strFolderCreate; 

@synthesize strFolderToList; 

static DropboxManager *singletonManager = nil; 

+(id)dropBoxManager 
{ 
    if(!singletonManager) 
     singletonManager = [[DropboxManager alloc] init]; 

    return singletonManager; 
} 

-(void)initDropbox 
{ 
    DBSession* session = [[DBSession alloc] initWithAppKey:kDropbox_AppKey appSecret:kDropbox_AppSecret root:kDropbox_RootFolder]; 
    session.delegate = self; 
    [DBSession setSharedSession:session]; 
    [session release]; 

    if([[DBSession sharedSession] isLinked] && objRestClient == nil) 
    {  
     self.objRestClient = [[DBRestClient alloc] initWithSession:[DBSession sharedSession]]; 
     self.objRestClient.delegate = self; 
    } 
} 

-(void)checkForLink 
{ 
    if(![[DBSession sharedSession] isLinked]) 
     [[DBSession sharedSession] linkFromController:apiCallDelegate]; 
} 

-(BOOL)handledURL:(NSURL*)url 
{ 
    BOOL isLinked=NO; 
    if ([[DBSession sharedSession] handleOpenURL:url]) 
    { 

     if([[DBSession sharedSession] isLinked]) 
     { 
      isLinked=YES; 
      [self dropboxDidLogin]; 
     } 
     else 
     { 
      isLinked = NO; 
      [self dropboxDidNotLogin]; 
     } 
    } 
    return isLinked; 
} 

#pragma mark - 
#pragma mark Handle login 

-(void)dropboxDidLogin 
{ 
    NSLog(@"Logged in"); 

    if([[DBSession sharedSession] isLinked] && self.objRestClient == nil) 
    {  
     self.objRestClient = [[DBRestClient alloc] initWithSession:[DBSession sharedSession]]; 
     self.objRestClient.delegate = self; 
    } 

    switch(currentPostType) 
    { 
     case DropBoxTypeStatusNone: 

      break; 

     case DropBoxGetAccountInfo: 
      [self loginToDropbox]; 
      break; 

     case DropBoxGetFolderList: 
      [self listFolders]; 
      break; 

     case DropBoxCreateFolder: 
      [self createFolder]; 
      break; 

     case DropBoxUploadFile: 
      [self uploadFile]; 
      break;   
    } 

    //[(MainViewController*)apiCallDelegate setLoginStatus]; 
} 

-(void)dropboxDidNotLogin 
{ 
    NSLog(@"Not Logged in"); 
    switch(currentPostType) 
    { 
     case DropBoxTypeStatusNone: 

      break; 

     case DropBoxUploadFile: 
      if([self.apiCallDelegate respondsToSelector:@selector(failedToUploadFile:)]) 
       [self.apiCallDelegate failedToUploadFile:@"Problem connecting dropbox. Please try again later."]; 
      break; 

     case DropBoxGetFolderList: 

      break; 

     case DropBoxCreateFolder: 

      break; 

     case DropBoxGetAccountInfo: 

      break; 
    } 
} 

#pragma mark - 
#pragma mark DBSessionDelegate methods 

- (void)sessionDidReceiveAuthorizationFailure:(DBSession*)session userId:(NSString *)userId 
{ 
    relinkUserId = [userId retain]; 
    [[[[UIAlertView alloc] initWithTitle:@"Dropbox Session Ended" message:@"Do you want to relink?" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Relink", nil] autorelease] show]; 
} 

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)index 
{ 
    if (index != alertView.cancelButtonIndex) 
     [[DBSession sharedSession] linkUserId:relinkUserId fromController:apiCallDelegate]; 

    [relinkUserId release]; 
    relinkUserId = nil; 
} 

#pragma mark - 
#pragma mark Fileupload 

-(void)uploadFile 
{ 
    if([[DBSession sharedSession] isLinked]) 
     [self.objRestClient uploadFile:strFileName toPath:strDestDirectory withParentRev:nil fromPath:strFilePath]; 
    else 
     [self checkForLink]; 
} 

-(void)downlaodFileFromSourcePath:(NSString*)pstrSourcePath destinationPath:(NSString*)toPath 
{ 
    if([[DBSession sharedSession] isLinked]) 
     [self.objRestClient loadFile:pstrSourcePath intoPath:toPath]; 
    else 
     [self checkForLink]; 
} 

- (void)restClient:(DBRestClient*)client uploadedFile:(NSString*)destPath from:(NSString*)srcPath metadata:(DBMetadata*)metadata 
{ 
    if([self.apiCallDelegate respondsToSelector:@selector(finishedUploadeFile)]) 
     [self.apiCallDelegate finishedUploadFile]; 

    NSLog(@"File uploaded successfully to path: %@", metadata.path); 
} 

- (void)restClient:(DBRestClient*)client loadedFile:(NSString*)destPath contentType:(NSString*)contentType 
{ 
    if([self.apiCallDelegate respondsToSelector:@selector(finishedDownloadFile)]) 
     [self.apiCallDelegate finishedDownloadFile]; 
} 

-(void)restClient:(DBRestClient *)client loadFileFailedWithError:(NSError *)error 
{ 
    if([self.apiCallDelegate respondsToSelector:@selector(failedToDownloadFile:)]) 
     [self.apiCallDelegate failedToDownloadFile:[error description]]; 
} 

- (void)restClient:(DBRestClient*)client uploadFileFailedWithError:(NSError*)error 
{ 
    if([self.apiCallDelegate respondsToSelector:@selector(failedToUploadFile:)]) 
     [self.apiCallDelegate failedToUploadFile:[error description]]; 

    NSLog(@"File upload failed with error - %@", error); 
} 

#pragma mark - 
#pragma mark Create Folder 

-(void)createFolder 
{ 
    if([[DBSession sharedSession] isLinked]) 
     [self.objRestClient createFolder:strFolderCreate]; 
    else 
     [self checkForLink]; 
} 

- (void)restClient:(DBRestClient*)client createdFolder:(DBMetadata*)folder 
{ 
    if([self.apiCallDelegate respondsToSelector:@selector(finishedCreateFolder)]) 
     [self.apiCallDelegate finishedCreateFolder]; 

    NSLog(@"Folder created successfully to path: %@", folder.path); 
} 

- (void)restClient:(DBRestClient*)client createFolderFailedWithError:(NSError*)error 
{ 
    if([self.apiCallDelegate respondsToSelector:@selector(failedToCreateFolder:)]) 
     [self.apiCallDelegate failedToCreateFolder:[error description]]; 

    NSLog(@"Folder create failed with error - %@", error); 
} 

#pragma mark - 
#pragma mark Load account information 

-(void)loginToDropbox 
{ 
    if([[DBSession sharedSession] isLinked]) 
     [self.objRestClient loadAccountInfo]; 
    else 
     [self checkForLink]; 
} 

- (void)restClient:(DBRestClient*)client loadedAccountInfo:(DBAccountInfo*)info 
{ 
    if([self.apiCallDelegate respondsToSelector:@selector(finishedLogin:)]) 
    { 
     NSMutableDictionary *userInfo = [[[NSMutableDictionary alloc] init] autorelease]; 
     [userInfo setObject:info.displayName forKey:@"UserName"]; 
     [userInfo setObject:info.userId forKey:@"UserID"]; 
     [userInfo setObject:info.referralLink forKey:@"RefferelLink"]; 
     [self.apiCallDelegate finishedLogin:userInfo]; 
    } 

    NSLog(@"Got Information: %@", info.displayName); 
} 

- (void)restClient:(DBRestClient*)client loadAccountInfoFailedWithError:(NSError*)error 
{ 
    if([self.apiCallDelegate respondsToSelector:@selector(failedToLogin:)]) 
     [self.apiCallDelegate failedToLogin:[error description]]; 

    NSLog(@"Failed to get account information with error - %@", error); 
} 

#pragma mark - 
#pragma mark Logout 

-(void)logoutFromDropbox 
{ 
    [[DBSession sharedSession] unlinkAll]; 
    [self.objRestClient release]; 
} 

#pragma mark - 
#pragma mark Check for login 

-(BOOL)isLoggedIn 
{ 
    return [[DBSession sharedSession] isLinked] ? YES : NO; 
} 

#pragma mark - 
#pragma mark Load Folder list 

-(void)listFolders 
{ 
    NSLog(@"Here-->%@",self.strFolderToList); 
    if([[DBSession sharedSession] isLinked]) 
     [self.objRestClient loadMetadata:self.strFolderToList]; 
    else 
     [self checkForLink];  
} 

- (void)restClient:(DBRestClient*)client loadedMetadata:(DBMetadata*)metadata 
{ 
    if (metadata.isDirectory) 
    { 
     NSLog(@"Folder '%@' contains:", metadata.contents); 
     for (DBMetadata *file in metadata.contents) 
     { 
      NSLog(@"\t%@", file); 
     } 

     if([apiCallDelegate respondsToSelector:@selector(getFolderContentFinished:)]) 
      [apiCallDelegate getFolderContentFinished:metadata]; 
    } 
    NSLog(@"Folder list success: %@", metadata.path); 

} 

- (void)restClient:(DBRestClient*)client metadataUnchangedAtPath:(NSString*)path 
{ 

} 

- (void)restClient:(DBRestClient*)client loadMetadataFailedWithError:(NSError*)error 
{ 
    NSLog(@"Load meta data failed with error - %@", error); 

    if([apiCallDelegate respondsToSelector:@selector(getFolderContentFailed:)]) 
     [apiCallDelegate getFolderContentFailed:[error localizedDescription]]; 
} 

例如使用頭文件

//Your view controller Header file. 
#import <UIKit/UIKit.h> 
#import "DropboxManager.h" 

@interface YourViewController : UIViewController <DropBoxDelegate> 
{ 
    DropboxManager *objManager; 
} 

@property (nonatomic,assign) DropboxManager *objManager; 


-(IBAction)btnUploadFileTapped:(id)sender; 

@end 

例如,用法實現文件

#import "YourViewController.h" 

@implementation YourViewController 
@synthesize objManager; 

// Implement viewDidLoad to do additional setup after loading the view, typically from a nib. 
- (void)viewDidLoad { 
    [super viewDidLoad]; 

    objManager = [DropboxManager dropBoxManager]; 
    objManager.apiCallDelegate =self; 
    [objManager initDropbox]; 
} 

-(IBAction)btnUploadFileTapped:(id)sender 
{ 
    objManager.currentPostType = DropBoxUploadFile; 
    objManager.strFileName = @"YourFileName"; 
    objManager.strFilePath = @"YourFilePath"; 
    objManager.strDestDirectory = @"/"; 
    [objManager uploadFile]; 
} 

#pragma mark - 
#pragma mark File upload delegate 

- (void)finishedUploadFile 
{ 
    NSLog(@"Uploaded successfully."); 
} 

- (void)failedToUploadFile:(NSString*)withMessage 
{ 
    NSLog(@"Failed to upload error is %@",withMessage); 
} 

@end 
+0

感謝您答覆Janak Nirmal。 – 2013-04-26 06:31:03

+0

亞..我是一個初學者..它很難理解..你能解釋一下嗎? – 2013-04-26 06:32:32

+0

您必須創建DropBoxManager.h和DropBoxManager.m文件。從上面複製代碼我已經給出並替換這些文件。現在,在名爲'YourViewController'的位置創建新控制器,並從上面替換其頭部和實現文件代碼。您需要更改文件名和文件路徑的btnUploadFileTapped方法,並將其與xib文件中的任何按鈕綁定。請按照此步驟嘗試點擊按鈕。 – 2013-04-26 06:36:37

0

只需添加

import UIKit/UIKit.h 

無論你獲得的回報比ARC其他錯誤。

相關問題