Apple文档中提供的SimpleFTPSample中存在打开stream错误

我想通过ftp上传图片到服务器。

我在苹果文档中find一个SimpleFTPSample ,并将其下载。

当运行应用程序(我使用xcode 4.5.2,目标iphone 5.0模拟器),它工作正常。 我试图通过这个应用程序在我的服务器中创build目录,并成功。

但是,上传应用程序中提供的图像将导致“打开stream错误”。 我没有做任何改变的应用程序。 只需inputurl,用户名和密码。 我认为这是没有问题的,因为我指定的目录是成功创build的。

当创build目录的URL是“ftp://54.xyz/newfolder/”它被成功创build。

但是,上传的url是“ftp://54.xyz/TestImage1.png”

文件path是“/var/folders/pn/8p0jc4qn70v37j58c1kwf8l80000gn/T/TestImage1.png”

通过追加最后的组件string与我指定的FTPurl获得URL。

那么,它有什么错误?

在fn中,

- (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode { case NSStreamEventErrorOccurred: { [self stopSendWithStatus:@"Stream open error"]; } break; 

被调用并显示stream打开错误。

我GOOGLE了一整天,没有需要的结果。 它非常紧急,我甚至不能为此开始赏金。 请帮忙

尝试这个….

  - (void)sendDidStart { // self.statusLabel.text = @"Sending"; [[NetworkManager sharedInstance] didStartNetworkOperation]; } - (void)updateStatus:(NSString *)statusString { assert(statusString != nil); //self.statusLabel.text = statusString; } - (void)sendDidStopWithStatus:(NSString *)statusString { if (statusString == nil) { statusString = @"Put succeeded"; } [[NetworkManager sharedInstance] didStopNetworkOperation]; } #pragma mark * Core transfer code // This is the code that actually does the networking. // Because buffer is declared as an array, you have to use a custom getter. // A synthesised getter doesn't compile. - (uint8_t *)buffer { return self->_buffer; } - (BOOL)isSending { return (self.networkStream != nil); } - (void)startSend:(NSString *)filePath { BOOL success; NSURL * url; NSLog(@"localFilePathforImage..:%@",localFilePathforImage); assert(localFilePathforImage != nil); assert([[NSFileManager defaultManager] fileExistsAtPath:localFilePathforImage]); assert( [localFilePathforImage.pathExtension isEqual:@"png"] || [localFilePathforImage.pathExtension isEqual:@"jpg"] ); assert(self.networkStream == nil); // don't tap send twice in a row! assert(self.fileStream == nil); // ditto // First get and check the URL. url = [[NetworkManager sharedInstance] smartURLForString:@"ftp://80.544/"]; success = (url != nil); if (success) { // Add the last part of the file name to the end of the URL to form the final // URL that we're going to put to. url = CFBridgingRelease( CFURLCreateCopyAppendingPathComponent(NULL, ( CFURLRef) url, ( CFStringRef) imageString , false) ); success = (url != nil); } // If the URL is bogus, let the user know. Otherwise kick off the connection. if ( ! success) { // self.statusLabel.text = @"Invalid URL"; } else { // Open a stream for the file we're going to send. We do not open this stream; // NSURLConnection will do it for us. self.fileStream = [NSInputStream inputStreamWithFileAtPath:localFilePathforImage]; assert(self.fileStream != nil); [self.fileStream open]; // Open a CFFTPStream for the URL. self.networkStream = CFBridgingRelease( CFWriteStreamCreateWithFTPURL(NULL, ( CFURLRef) url) ); assert(self.networkStream != nil); // if ([self.usernameText.text length] != 0) { success = [self.networkStream setProperty:@"yourusername" forKey:(id)kCFStreamPropertyFTPUserName]; assert(success); success = [self.networkStream setProperty:@"password" forKey:(id)kCFStreamPropertyFTPPassword]; assert(success); //} self.networkStream.delegate = self; [self.networkStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; [self.networkStream open]; // Tell the UI we're sending. [self sendDidStart]; } } - (void)stopSendWithStatus:(NSString *)statusString { if (self.networkStream != nil) { [self.networkStream removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; self.networkStream.delegate = nil; [self.networkStream close]; self.networkStream = nil; } if (self.fileStream != nil) { [self.fileStream close]; self.fileStream = nil; } [self sendDidStopWithStatus:statusString]; } - (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode // An NSStream delegate callback that's called when events happen on our // network stream. { #pragma unused(aStream) assert(aStream == self.networkStream); switch (eventCode) { case NSStreamEventOpenCompleted: { [self updateStatus:@"Opened connection"]; } break; case NSStreamEventHasBytesAvailable: { assert(NO); // should never happen for the output stream } break; case NSStreamEventHasSpaceAvailable: { [self updateStatus:@"Sending"]; // If we don't have any data buffered, go read the next chunk of data. if (self.bufferOffset == self.bufferLimit) { NSInteger bytesRead; bytesRead = [self.fileStream read:self.buffer maxLength:sSendBufferSize]; if (bytesRead == -1) { [self stopSendWithStatus:@"File read error"]; } else if (bytesRead == 0) { [self stopSendWithStatus:nil]; } else { self.bufferOffset = 0; self.bufferLimit = bytesRead; } } // If we're not out of data completely, send the next chunk. if (self.bufferOffset != self.bufferLimit) { NSInteger bytesWritten; bytesWritten = [self.networkStream write:&self.buffer[self.bufferOffset] maxLength:self.bufferLimit - self.bufferOffset]; assert(bytesWritten != 0); if (bytesWritten == -1) { [self stopSendWithStatus:@"Network write error"]; } else { self.bufferOffset += bytesWritten; } } } break; case NSStreamEventErrorOccurred: { [self stopSendWithStatus:@"Stream open error"]; } break; case NSStreamEventEndEncountered: { // ignore } break; default: { assert(NO); } break; } } 

我有同样的问题。

这是每个托pipe提供商。 我认为问题在于代码可能被login名= dev@atoz.com中的“@”符号弄糊涂了。

你用@ sing用户名吗?

在PutController.m中设置networkStream委托之前添加这一行StartSend为我解决了这个问题:

 [self.networkStream setProperty:(id)kCFBooleanFalse forKey:(id)kCFStreamPropertyFTPUsePassiveMode]; 

没有上面的行(或与设置为kCFBooleanTrue而不是kCFBooleanFalse属性),我一直有stream开放错误。 我只尝试了一个FTP服务器,但它似乎并不支持显然是默认的被动模式。