如何使用Xcode上传/下载文件到/从Dropbox

5
如何从/向Dropbox上传/下载文件?我在我的应用程序中集成了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
有什么问题吗?混淆的原因?错误日志? - Janak Nirmal
实际上...在Dropbox应用程序中遇到了问题。 - Thanush Shre
我正在尝试上传和下载文件,但是我无法成功。 - Thanush Shre
2个回答

6

让我来帮助你,我已经为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

感谢您的回复,Janak Nirmal。 - Thanush Shre
噢..我是个初学者..很难理解..您可以解释一下吗? - Thanush Shre
你需要创建DropBoxManager.h和DropBoxManager.m文件。复制我提供的上面的代码并替换这些文件中的代码。现在,在名为“YourViewController”的新控制器中创建并替换其头文件和实现文件中的代码。您需要更改btnUploadFileTapped方法以获取文件名和文件路径,并将其绑定到xib文件中的任何一个按钮上。请按照此操作,然后尝试单击按钮。 - Janak Nirmal
@Kalaichelvan 谢谢,我很久以前写了这段代码。抱歉现在有点忙,不知道最新的SDK冲突情况。如果我有时间帮忙更新,我会及时通知你的。真的很抱歉。 - Janak Nirmal
如何下载文件。我想要上传CSV文件并将同一文件下载到我的应用程序中。 - Shahrukh
显示剩余2条评论

-1

只需添加

import UIKit/UIKit.h

无论您在哪里遇到除 ARC 之外的错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接