2014-10-20 51 views
1

将任何iWork的文件(PagesKeynoteNumbers)到NSDataUIDocumentPickerViewController似乎并不奏效,因为它们不是文件,而是目录。附加的iWork文件不起作用,因为他们没有目录文件

这里是我的代码:

NSString *fileName = [[url path] lastPathComponent]; 
NSData *fileData = [[NSFileManager defaultManager] contentsAtPath:[docPickerUrl path]]; 
NSString *fileExtension = [docPickerUrl pathExtension]; 
NSString *UTI = (__bridge_transfer NSString *)UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, (__bridge CFStringRef)fileExtension, NULL); 
NSString *contentType = (__bridge_transfer NSString *)UTTypeCopyPreferredTagWithClass((__bridge CFStringRef)UTI, kUTTagClassMIMEType); 

FILEDATA总是nil因为NSFileManager不能目录转换为数据。

我得到url- (void)documentPicker:(UIDocumentPickerViewController *)controller didPickDocumentAtURL:(NSURL *)url

回答

0

你有没有得到任何与此,我试着用SSZipArchive或ZipArchive压缩包,但得到崩溃。

这是哪里我可以帮助激发一些想法。

- (void)documentPicker:(UIDocumentPickerViewController *)controller didPickDocumentAtURL:(NSURL *)url { 
if (controller.documentPickerMode == UIDocumentPickerModeImport) { 
NSArray *dirContents = [[NSFileManager defaultManager] contentsOfDirectoryAtURL:url includingPropertiesForKeys:[NSArray arrayWithObject:NSURLNameKey] options:0 error:nil]; 

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *newDocDirectory = [paths objectAtIndex:0]; 

NSString *docDirectory = [dirContents objectAtIndex:0]; 
BOOL isDir=NO; 
NSArray *subpaths; 
NSString *exportPath = docDirectory; 
NSFileManager *fileManager = [NSFileManager defaultManager]; 
if ([fileManager fileExistsAtPath:exportPath isDirectory:&isDir] && isDir){ 
    subpaths = [fileManager subpathsAtPath:exportPath]; 
} 

NSString *archivePath = [newDocDirectory stringByAppendingString:@".zip"]; 

ZipArchive *archiver = [[ZipArchive alloc] init]; 
[archiver CreateZipFile2:archivePath]; 
for(NSString *path in subpaths) 
{ 
    NSString *longPath = [exportPath stringByAppendingPathComponent:path]; 
    if([fileManager fileExistsAtPath:longPath isDirectory:&isDir] && !isDir) 
    { 
     NSLog(@"adding file %@", path); 
     [archiver addFileToZip:longPath newname:path]; 
    } 
} 

NSData *documentData = [NSData dataWithContentsOfFile:archivePath]; 

//post documentDate as zip file to server 

} }

2

我建议经历一个NSFileCoordinator对象,这是需要AFAIK用于访问安全范围的文件,例如那些通过升降梭箱和icloud的。 (在这种情况下,取消注释下面代码中的倒数第一行和倒数第二行)。您希望用于NSFIleCoordinator的coordinateReadingItemAtURL:options参数是NSFileCoordinatorReadingForUploading。这将正常读取单个文件,但会自动将目录转换为zip文件。剥离已添加的.zip,您将拥有有效的Pages/Numbers/Keynote文件。 (这是它有效的了。)在NSFileCoordinator选项

- (void)documentPicker:(UIDocumentPickerViewController *)controller didPickDocumentAtURL:(NSURL *)url { 
    //[url startAccessingSecurityScopedResource]; // Necessary for security-scoped files 
    NSFileCoordinator *coordinator = [[NSFileCoordinator alloc] init]; 
    NSError *error; 
    __block NSData *fileData; 

    [coordinator coordinateReadingItemAtURL:url options:NSFileCoordinatorReadingForUploading error:&error byAccessor:^(NSURL *newURL) { 
    // File name for use in writing the file out later 
    NSString *fileName = [newURL lastPathComponent]; 
    NSString *fileExtension = [newURL pathExtension]; 

    // iWork files will be in the form 'Filename.pages.zip' 
    if([fileExtension isEqualToString:@"zip"]) { 
     if([[[newURL URLByDeletingPathExtension] pathExtension] isEqualToString:@"pages"] || 
      [[[newURL URLByDeletingPathExtension] pathExtension] isEqualToString:@"numbers"] || 
      [[[newURL URLByDeletingPathExtension] pathExtension] isEqualToString:@"key"]) { 
     // Remove .zip if it is an iWork file 
     fileExtension = [[newURL URLByDeletingPathExtension] pathExtension]; 
     fileName = [[newURL URLByDeletingPathExtension] lastPathComponent]; 
     } 
    } 

    NSError *fileConversionError; 
    fileData = [NSData dataWithContentsOfURL:newURL options:NSDataReadingUncached error:&fileConversionError]; 

    // Do something with the file data here 

    } 
    //[url stopAccessingSecurityScopedResource]; // Necessary for security-scoped files 
} 

相关文件苹果在这里: https://developer.apple.com/library/ios/documentation/Foundation/Reference/NSFileCoordinator_class/#//apple_ref/c/tdef/NSFileCoordinatorReadingOptions

相关问题