2013-08-16 37 views
1

我想用QLPreviewController预览Dropbox中存储的文件。 QLPreviewController需要NSURL,但Dropbox DBFile只返回NSFileHandle *NSData *NSString *中的文件内容。如何从Dropbox文件获取NSURL?

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

+0

使用此方法 - (void)restClient:(DBRestClient *)client loadedMetadata:(DBMetadata *)元数据 – iPatel

回答

1

我正在使用dropbox sync API。

下面是将dropbox文件复制到临时目录的代码片段,从而将DBFileInfo项目“转换”为NSURL。

这种方法:

  • 假设你有一个self.file的NSArray含DBFileInfo项目(见:[[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; 
    } 
} 
0

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