2013-08-16 5 views
1

Я хотел бы использовать QLPreviewController для предварительного просмотра файла, хранящегося в Dropbox. QLPreviewController принимает NSURL, однако Dropbox DBFile возвращает только NSFileHandle * или содержимое файла в NSData * или NSString *.Как получить NSURL из файла Dropbox?

Каков наилучший способ для предварительного просмотра Dropbox DBFile в QLPreviewController?

+0

использовать этот метод - (void) restClient: (DBRestClient *) client loadedMetadata: (DBMetadata *) метаданные – iPatel

ответ

1

Я использую API-интерфейс Dropbox Sync.

Вот фрагмент, который копирует файл 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-адрес файла. Таким образом, содержимое файла необходимо загрузить и сохранить на диск (используя любой из методов поиска файлов, которые вы хотите).

Смежные вопросы