草庐IT

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

coder 2023-09-28 原文

我如何从 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];

最佳答案

在这种情况下让我来帮助您,我已经为 Dropbox 创建了 Wrapper 类,查找下面在我的一个项目中使用的代码。 不支持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

关于ios - 如何使用 Xcode 从 Dropbox 上传/下载文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16212064/

有关ios - 如何使用 Xcode 从 Dropbox 上传/下载文件的更多相关文章

  1. ruby - 如何使用 Nokogiri 的 xpath 和 at_xpath 方法 - 2

    我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div

  2. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

    总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

  3. ruby - 使用 RubyZip 生成 ZIP 文件时设置压缩级别 - 2

    我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看ruby​​zip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d

  4. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  5. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  6. ruby - 在 Ruby 中使用匿名模块 - 2

    假设我做了一个模块如下:m=Module.newdoclassCendend三个问题:除了对m的引用之外,还有什么方法可以访问C和m中的其他内容?我可以在创建匿名模块后为其命名吗(就像我输入“module...”一样)?如何在使用完匿名模块后将其删除,使其定义的常量不再存在? 最佳答案 三个答案:是的,使用ObjectSpace.此代码使c引用你的类(class)C不引用m:c=nilObjectSpace.each_object{|obj|c=objif(Class===objandobj.name=~/::C$/)}当然这取决于

  7. ruby - 其他文件中的 Rake 任务 - 2

    我试图在一个项目中使用rake,如果我把所有东西都放到Rakefile中,它会很大并且很难读取/找到东西,所以我试着将每个命名空间放在lib/rake中它自己的文件中,我添加了这个到我的rake文件的顶部:Dir['#{File.dirname(__FILE__)}/lib/rake/*.rake'].map{|f|requiref}它加载文件没问题,但没有任务。我现在只有一个.rake文件作为测试,名为“servers.rake”,它看起来像这样:namespace:serverdotask:testdoputs"test"endend所以当我运行rakeserver:testid时

  8. ruby-on-rails - 在 Rails 中将文件大小字符串转换为等效千字节 - 2

    我的目标是转换表单输入,例如“100兆字节”或“1GB”,并将其转换为我可以存储在数据库中的文件大小(以千字节为单位)。目前,我有这个:defquota_convert@regex=/([0-9]+)(.*)s/@sizes=%w{kilobytemegabytegigabyte}m=self.quota.match(@regex)if@sizes.include?m[2]eval("self.quota=#{m[1]}.#{m[2]}")endend这有效,但前提是输入是倍数(“gigabytes”,而不是“gigabyte”)并且由于使用了eval看起来疯狂不安全。所以,功能正常,

  9. ruby - 使用 ruby​​ 和 savon 的 SOAP 服务 - 2

    我正在尝试使用ruby​​和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我

  10. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

随机推荐