Objective-C dataWithContentsOfURL返回nill
我在这里有这个代码:
NSString *stringURL = @"\\\\SERVER\\FOLDER\\FOLDER\\FTP\\ANC\\ANC.pdf"; NSURL *url = [NSURL fileURLWithPath:stringURL]; NSData *urlData = [NSData dataWithContentsOfURL:url];
但urlData返回nill
我已经尝试datawithcontentsoffile数据,但使用urlvariables时,我得到了一个警告。
当我得到这个URL文件://SERVER/FOLDER/FOLDER/FTP/ANC.pdf在Windows中,它打开文件,但在Mac它不会。
我也尝试了以下几点:
NSString *stringURL = @"file://SERVER/FOLDER/FOLDER/FTP/ANC.pdf"; NSURLSession *session = [NSURLSession sharedSession]; [[session dataTaskWithURL:[NSURL URLWithString:stringURL] completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { // handle response }] resume]; // NSURL *url = [NSURL URLWithString:stringURL]; // NSData *urlData = [NSData dataWithContentsOfURL:url];
但得到这些错误:
NSErrorFallingURLStringKey NSErrorFallingURLKey NSLocalizedDescription NSUnderlyingError
更新我能够得到url不会返回nill与以下内容:
NSURL *url = [NSURL fileURLWithPath:@"file:///server/FOLDER/FOLDER/FTP/ANC/ANC.pdf"];
然而,这返回nill:
NSData *urlData = [NSData dataWithContentsOfURL:url];
我添加了错误:dataWithContentsofURL
它返回这个:
connectionError NSError * domain: @"NSCocoaErrorDomain" - code: 260 0x166d8af0
我通过Get Info查看了有问题的文件,它开始像这样smb://server/folder/folder/ANC/ANC.pdf
NSData和URLs:有龙
+[NSData dataWithContentsOfURL:]
可以由于许多原因返回nil
。 如果尝试使用该URL时出现任何错误,此方法将返回nil
。 例如,文件可能不存在,networking连接可能会超时,或者URL甚至可能不正确。 nil
返回,应用程序不知道为什么。
+ [NSData dataWithContentsOfURL:options:error:]
另一方面, 会告诉调用者出了什么问题。 当返回nil
, error
参数将填充一个描述发生问题的对象。 使用这种方法将直接回答“为什么”的问题。
这两种方法都是同步方法,并且它们用于处理文件,networking资源,特别是从networking资源提供的文件的使用是不鼓励的。 这些方法将阻止调用者,并不是真正用于这种用途。 最好使用inputstream或NSURLSession
代替。
SMB不支持
从你的问题,虽然你似乎试图访问SMB共享上存在的文件。 不幸的是,iOS不支持SMB – 即使你有一个格式正确的smb URL(即smb://servername/sharename/filename.pdf),你也将无法使用第三方SMB实现来访问它。
但是,使用FTP代替SMB,应该可以工作。
只需要做一些小的改变,其实你的pdf文件是在服务器上,所以你必须这样改变你的代码。
NSURL *url = [NSURL URLWithString:stringURL];
我试过这个,工作正常。
如果您的文件位于应用程序的主包中,则可以使用fileURLWithPath
。
如果您的反斜杠分隔符有一个有效的Windows文件path,则有一个CoreFoundation
方法可将其转换为CFURL
/ NSURL
对象
NSString *stringURL = @"\\\\SERVER\\FOLDER\\FOLDER\\FTP\\ANC\\ANC.pdf"; NSURL *url = (NSURL *)CFBridgingRelease(CFURLCreateWithFileSystemPath(kCFAllocatorDefault, stringURL, kCFURLWindowsPathStyle, false));
如果string以file://
开头,则这是一个带有file
scheme的Mac URLstring,您可以使用
NSString *fileURLString = @"file:///Applications"; NSURL *url = [NSURL URLWithString:fileURLString];
考虑一个有效的文件模式string在该scheme的两个斜线之后必须具有第三个斜杠作为根文件夹。
fileURLWithPath
方法只能在string以单斜杠开始时使用,隐式添加file://
scheme。
NSString *pathString = "/Applications"; NSURL *url = [NSURL fileURLWithPath: pathString];
确保URL包含http://
或https://
。 例如: http://SERVER/FOLDER/FILE.pdf
在iOS应用程序中访问文件时需要注意以下两点:
-
如果您从iOS应用程序沙箱(文档或caching目录)访问文件,请使用以下命令:
NSURL *url = [NSURL fileURLWithPath:strUrl];
-
如果您正在从iOS应用程序的任何服务器访问文件,请使用以下命令:
NSURL *url = [NSURL URLWithString:strUrl];
注意:从模拟器运行时,无法从iOS应用程序的Mac中访问文件。
希望这可以帮助!
请使用此代码检查您的代码
-(void)downloadPdfBtnPressed:(id)sender { NSString *dowloadURL = [DownloadUrlArray objectAtIndex:[sender tag ]]; NSString *filename =[dowloadURL lastPathComponent]; NSString *stringPath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)objectAtIndex:0]stringByAppendingPathComponent:@"/Download"]; if (![[NSFileManager defaultManager] fileExistsAtPath:stringPath]) [[NSFileManager defaultManager] createDirectoryAtPath:stringPath withIntermediateDirectories:NO attributes:nil error:nil]; NSData *pdfData = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:dowloadURL]]; if(pdfData) { stringPath = [stringPath stringByAppendingPathComponent:filename]; [pdfData writeToFile:stringPath atomically:YES]; UIAlertView *alert = [[UIAlertView alloc] initWithTitle:[singletonObj getTranslationForKey:@"AlereTitleContactus"] message:@"PDF file is downloaded" delegate:nil cancelButtonTitle:[singletonObj getTranslationForKey:@"alertOK"] otherButtonTitles:nil]; [alert show]; } }