Your workflow is unique 👨💻 - tell us how you use Dropbox here.
Forum Discussion
C. Logan
9 years agoExplorer | Level 3
Uploading big file using Objective-C API V2 very SLOW...
Hello, recently our app updates the Dropbox related code from API V1 to API V2. Usually we need to transfer files to Dropbox, it is OK for small files, but for video files of size about 1.5 GB th...
C. Logan
9 years agoExplorer | Level 3
You cannot run the code without our external device. But the following code does the same thing and produces the the same result.
You need to provide the source file to be uploaded. The destination file is hard coded (/temp/test.mp4), you can modify it to another file path. The unused parameters in the API uploadInternal:files:index:fromDir:toDropboxDir:opType:resArray: can be ignored.
If there is anything unclear, feel free to point out.
const NSUInteger DB_BLOCK_SIZE = 5*1024*1024; // 102400000;
@interface DestVC ()
@property DBUploadTask<DBFILESUploadSessionStartResult *, DBNilObject *> * uploadTask;
@property DBUploadTask<DBNilObject *, DBFILESUploadSessionLookupError *> * continueTask;
@property DBUploadTask<DBFILESFileMetadata *, DBFILESUploadSessionFinishError *> *finishTask;
@property unsigned long long offset;
@property NSFileHandle *file;
@property NSData *data;
@property NSNumber *fileSize;
@property DropboxClient *client;
@property NSString *sessionId;
@end
@implementation DestVC
- (void)uploadInternal:(NSArray *)items files:(NSArray *)files index:(int)index fromDir:(NSString *)fromDir toDropboxDir:(NSString *)toDir opType:(OperationType)opType resArray:(NSMutableArray *)resArray {
NSString *file = [files objectAtIndex:index];
NSString *srcPath = [fromDir stringByAppendingPathComponent:file];// define your own source file to be uploaded
// NSString *dstPath = [toDir stringByAppendingPathComponent:file];// define your own destination file in Dropbox
_client = [DropboxClientsManager authorizedClient];
if (!_client) {
[DropboxClientsManager authorizeFromController:[UIApplication sharedApplication]
controller:self
openURL:^(NSURL *url) {
[[UIApplication sharedApplication] openURL:url];
}
browserAuth:YES];
} else {
_fileSize = [FCFileManager sizeOfFileAtPath:srcPath];// get file size
_file = [NSFileHandle fileHandleForReadingAtPath:srcPath];
_data = [_file readDataOfLength:DB_BLOCK_SIZE];
_uploadTask = [_client.filesRoutes uploadSessionStartData:_data];
[_uploadTask response:^(DBFILESUploadSessionStartResult * _Nullable result, DBNilObject * _Nullable obj, DBRequestError * _Nullable error) {
DLog(@"result: %@", result);
DLog(@"routeError: %@", obj);
DLog(@"error: %@", error);
if (error == nil) {
_sessionId = result.sessionId;
DBFILESUploadSessionCursor *cursor = [[DBFILESUploadSessionCursor alloc] initWithSessionId:result.sessionId offset:[NSNumber numberWithUnsignedLongLong:_file.offsetInFile]];
[self uploadNext:cursor];
} else {
[_file closeFile];
}
}];
[_uploadTask progress:^(int64_t bytesWritten, int64_t totalBytesWritten, int64_t totalBytesExpectedToWrite) {
NSLog(@"Start: bytesWritten = %lld", bytesWritten);
}];
}
return;
}
- (void)uploadNext:(DBFILESUploadSessionCursor *)cursor {
if ([_fileSize unsignedLongLongValue] - _file.offsetInFile > DB_BLOCK_SIZE) {
_data = [_file readDataOfLength:DB_BLOCK_SIZE];
} else {
unsigned long long rest = [_fileSize unsignedLongLongValue] - _file.offsetInFile;
_data = [_file readDataOfLength:rest];
}
if (_data.length < DB_BLOCK_SIZE) {
DBFILESCommitInfo *info = [[DBFILESCommitInfo alloc] initWithPath:@"/temp/test.mp4"];// define your destination file
_finishTask = [_client.filesRoutes uploadSessionFinishData:cursor commit:info inputData:_data];
[_finishTask response:^(DBFILESFileMetadata * _Nullable meta, DBFILESUploadSessionFinishError * _Nullable finishError, DBRequestError * _Nullable error) {
DLog(@"meta: %@", meta);
DLog(@"finishError: %@", finishError);
DLog(@"error: %@", error);
}];
return;
}
_continueTask = [_client.filesRoutes uploadSessionAppendV2Data:cursor inputData:_data];
[_continueTask response:^(DBNilObject * _Nullable obj, DBFILESUploadSessionLookupError * _Nullable lookupError, DBRequestError * _Nullable error) {
DLog(@"obj: %@", obj);
DLog(@"lookupError: %@", lookupError);
DLog(@"error: %@", error);
if (error == nil) {
DLog(@"_file.offsetInFile: %lld", _file.offsetInFile);
DBFILESUploadSessionCursor *cursor = [[DBFILESUploadSessionCursor alloc] initWithSessionId:_sessionId offset:[NSNumber numberWithUnsignedLongLong:_file.offsetInFile]];
[self uploadNext:cursor];
} else {
[_file closeFile];
}
}];
[_continueTask progress:^(int64_t bytesWritten, int64_t totalBytesWritten, int64_t totalBytesExpectedToWrite) {
NSLog(@"Continue: bytesWritten = %lld", bytesWritten);
}];
}
@end
C. Logan
9 years agoExplorer | Level 3
Remark: File size can also be obtained through following code instead of using FCFileManager:
NSDictionary *attributes = [[NSFileManager defaultManager] attributesOfItemAtPath:path error:NULL];
fileSize = [attributes fileSize];
About Dropbox API Support and Feedback
Get help with the Dropbox API from fellow developers and experts.
The Dropbox Community team is active from Monday to Friday. We try to respond to you as soon as we can, usually within 2 hours.
If you need more help you can view your support options (expected response time for an email or ticket is 24 hours), or contact us on X, Facebook or Instagram.
For more info on available support options for your Dropbox plan, see this article.
If you found the answer to your question in this Community thread, please 'like' the post to say thanks and to let us know it was useful!