1

我想QLPreviewController用来预览存储在 Dropbox 中的文件。QLPreviewController接受 NSURL,但是 DropboxDBFile只返回 a NSFileHandle *or 中的文件内容NSData *or NSString *

DBFile预览 Dropbox的正确方法是QLPreviewController什么?

4

2 回答 2

1

我正在使用 Dropbox 同步 API。

这是一个将保管箱文件复制到临时目录的片段,从而将 DBFileInfo 项“转换”为 NSURL。

这种方法:

  • 假设您有一个包含 DBFileInfo 项的self.file NSArray[[DBFilesystem sharedFilesystem] listFolder:[DBPath root] error:&err]; (请参阅:)
  • 打开并将信息项读取为 NSData
  • 写入具有相同文件名的 tempURL
  • 并返回 tempURL

该片段并不完美,但可以按原样使用。但是,应该使用一些用户信息,例如带有进度微调器的 HUD(下载文件可能需要一段时间)。

- (NSURL*)urlOfDropboxItemAtIndex:(NSUInteger)index {
    if(index < self.files.count) {
        //[self presentProcessingFileHUD];
        __block NSURL *fileURL;

        dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
            NSError *err;
            DBFileInfo *fileInfo = self.files[index];
            NSString *tempDir = NSTemporaryDirectory();
            NSURL *tempURL = [NSURL fileURLWithPath:[tempDir stringByAppendingPathComponent:@"dropbox-tmp"]];
            // create tempURL
            NSFileManager *fileManager = [NSFileManager defaultManager];
            if(![fileManager fileExistsAtPath:tempURL.path]) {
                [fileManager createDirectoryAtURL:tempURL withIntermediateDirectories:YES attributes:nil error:&err];
                if(err) {
                    NSString *errMsg = [NSString stringWithFormat:@"Error creating temp directory at %@", tempURL.path];
                    NSLog(@"%@",errMsg);
                    [self presentErrorHUDWithMessage:errMsg];
                }
            }
            fileURL = [tempURL URLByAppendingPathComponent:fileInfo.path.name];
            // read dropbox file
            DBFile *file = [[DBFilesystem sharedFilesystem] openFile:fileInfo.path error:&err];
            if(file && !err) {
                NSData *fileData = [file readData:&err];
                if(err) { NSLog(@"Error reading data from file %@ (%@)", fileURL.path, err); }
                [fileData writeToURL:fileURL atomically:YES];
                [file close];
                //[self dismissHUD];

            } else {
                NSString *errStr = [NSString stringWithFormat:@"Error accessing Dropbox file %@ (%@)", fileURL.path, err];
                NSLog(@"%@", errStr);
                //[self presentErrorHUDWithMessage:errStr];
                fileURL = nil;

            }
        });
        return fileURL;

    } else {
        return nil;
    }
}
于 2013-10-17T23:49:59.250 回答
0

QLPreviewController可能需要一个NSURL,但它必须是一个文件 URL。因此,需要下载文件内容并将其保存到磁盘(使用您想要的任何获取文件数据的方法)。

于 2013-08-16T09:16:15.900 回答