nsoutputstream 停留在状态 1(NSStreamStatusOpening = 1) - iOS - objective c
nsoutputstream stuck in status 1(NSStreamStatusOpening = 1) - iOS - objective c
我尝试将 iPod 音乐上传到 ftp 服务器。
所以使用 AVAssetExportSession,我在文档文件夹中创建了一个文件
exportSession.outputURL = [NSURL fileURLWithPath:musicFilePath];
[exportSession exportAsynchronouslyWithCompletionHandler:^{
if(exportSession.status == AVAssetExportSessionStatusCompleted) {
NSLog(@"export completed.");
self.exportedMusicPath = musicFilePath;
[self.delegate exportMusicFinish:self.exportedMusicPath];
}
else {
NSLog(@"export failed.");
[self.delegate exportMusicFinish:@"export failed"];
}
}];
然后我为我的 ftp 上传打开一个 nsoutputstream 并通过委托
获取导出的文件路径
-(void) exportMusicFinish:(NSString *)exportedMusicPath {
if(!self.fileUpload) {
self.fileUpload = [[FTPUpload alloc] init];
self.fileUpload.delegate = self;
}
self.exporter = nil;
[self.fileUpload uploadFileToFTP:exportedMusicPath];
}
self.fileStream = [NSInputStream inputStreamWithFileAtPath:filePath];
assert(self.fileStream != nil);
[self.fileStream open];
// Open a CFFTPStream for the URL.
self.networkStream = CFBridgingRelease(CFWriteStreamCreateWithFTPURL(NULL, (__bridge CFURLRef) url));
[self.networkStream setProperty:(id)kCFBooleanFalse forKey:(NSString *)kCFStreamPropertyFTPAttemptPersistentConnection];
assert(self.networkStream != nil);
success = [self.networkStream setProperty:@"userid" forKey:(id)kCFStreamPropertyFTPUserName];
assert(success);
success = [self.networkStream setProperty:@"userpw" forKey:(id)kCFStreamPropertyFTPPassword];
assert(success);
//- (BOOL)setProperty:(id)property forKey:(NSString *)key ,object casting needed
self.networkStream.delegate = self;
[self.networkStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[self.networkStream open];
但我的网络流 (nsoutputqtream) 卡在打开状态。
我的 url,路径正确并且上传 class 可以正常上传到我的文档文件夹中的所有文件,除了这个导出的文件
谁能帮帮我?我不擅长 iOS 编程...
Core Foundation 的 FTP 支持已弃用,原因有很多。其一,如果我没记错的话,它从来都不是很好用。另一方面,FTP 是一种糟糕的上传数据方式。它不支持恢复上传,它缺乏任何安全性(明文密码),如果你在基于 NAT 的防火墙后面,就有永远无法连接的风险……基本上,FTP 是一场灾难,一半,你甚至不应该考虑在新应用中使用它。
给自己一个网络服务器,安装 WebDAV,然后使用 PUT 请求。这为您提供身份验证、TLS(加密)和本机 NSURLSession 支持。这是解决这个问题的好得多的方法。
我尝试将 iPod 音乐上传到 ftp 服务器。 所以使用 AVAssetExportSession,我在文档文件夹中创建了一个文件
exportSession.outputURL = [NSURL fileURLWithPath:musicFilePath];
[exportSession exportAsynchronouslyWithCompletionHandler:^{
if(exportSession.status == AVAssetExportSessionStatusCompleted) {
NSLog(@"export completed.");
self.exportedMusicPath = musicFilePath;
[self.delegate exportMusicFinish:self.exportedMusicPath];
}
else {
NSLog(@"export failed.");
[self.delegate exportMusicFinish:@"export failed"];
}
}];
然后我为我的 ftp 上传打开一个 nsoutputstream 并通过委托
获取导出的文件路径-(void) exportMusicFinish:(NSString *)exportedMusicPath {
if(!self.fileUpload) {
self.fileUpload = [[FTPUpload alloc] init];
self.fileUpload.delegate = self;
}
self.exporter = nil;
[self.fileUpload uploadFileToFTP:exportedMusicPath];
}
self.fileStream = [NSInputStream inputStreamWithFileAtPath:filePath];
assert(self.fileStream != nil);
[self.fileStream open];
// Open a CFFTPStream for the URL.
self.networkStream = CFBridgingRelease(CFWriteStreamCreateWithFTPURL(NULL, (__bridge CFURLRef) url));
[self.networkStream setProperty:(id)kCFBooleanFalse forKey:(NSString *)kCFStreamPropertyFTPAttemptPersistentConnection];
assert(self.networkStream != nil);
success = [self.networkStream setProperty:@"userid" forKey:(id)kCFStreamPropertyFTPUserName];
assert(success);
success = [self.networkStream setProperty:@"userpw" forKey:(id)kCFStreamPropertyFTPPassword];
assert(success);
//- (BOOL)setProperty:(id)property forKey:(NSString *)key ,object casting needed
self.networkStream.delegate = self;
[self.networkStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[self.networkStream open];
但我的网络流 (nsoutputqtream) 卡在打开状态。
我的 url,路径正确并且上传 class 可以正常上传到我的文档文件夹中的所有文件,除了这个导出的文件
谁能帮帮我?我不擅长 iOS 编程...
Core Foundation 的 FTP 支持已弃用,原因有很多。其一,如果我没记错的话,它从来都不是很好用。另一方面,FTP 是一种糟糕的上传数据方式。它不支持恢复上传,它缺乏任何安全性(明文密码),如果你在基于 NAT 的防火墙后面,就有永远无法连接的风险……基本上,FTP 是一场灾难,一半,你甚至不应该考虑在新应用中使用它。
给自己一个网络服务器,安装 WebDAV,然后使用 PUT 请求。这为您提供身份验证、TLS(加密)和本机 NSURLSession 支持。这是解决这个问题的好得多的方法。