2013-08-16 62 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。因此,文件內容需要下載並保存到磁盤(使用任何您需要的文件數據採集方法)。