Почему я не могу заставить код SimpleFTPSample работать на меня? - PullRequest
0 голосов
/ 05 сентября 2011

Я пытался заставить Apple's SimpleFTPSample работать на меня, но я просто не могу. Вот код, который я использовал:

BOOL                    success;
CFWriteStreamRef        ftpStream;

NSLog(@"Hello");
// assert(self.networkStream == nil);      // don't tap send twice in a row!
// assert(self.fileStream == nil);         // ditto

// First get and check the URL.

url = [NSURL URLWithString:@hostname];
success = (url != nil);
NSLog(@"After first success");
if (success) {
    NSLog(@"In the success if");
    // 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.
    if(fileName) NSLog(@"Filename.");
    if(url) NSLog(@"url");
    url = [NSMakeCollectable(
                             CFURLCreateCopyAppendingPathComponent(NULL, (CFURLRef) url,
                                                                   //(CFStringRef) [fileName lastPathComponent], 
                                                                   (CFStringRef)pngPath,
                                                                   false)
                             ) autorelease];
    [url retain];
    NSLog(@"After url=");
    success = (url != nil);
    assert(success);
    NSLog(@"End of success if");
}
// If the URL is bogus, let the user know.  Otherwise kick off the connection.

if ( ! success) {
    NSLog(@"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:pngPath];
    assert(self.fileStream != nil);

    [self.fileStream open];

    // Open a CFFTPStream for the URL.

    ftpStream = CFWriteStreamCreateWithFTPURL(NULL, (CFURLRef) url);
    if(!ftpStream) NSLog(@"ftpStream is null");
    assert(ftpStream != NULL);

    self.networkStream = (NSOutputStream *) ftpStream;


#pragma unused (success) //Adding this to appease the static analyzer.
    success = [self.networkStream setProperty:@"JEFF" forKey:(id)kCFStreamPropertyFTPUserName];
    assert(success);
    success = [self.networkStream setProperty:@"jeffrack" forKey:(id)kCFStreamPropertyFTPPassword];
    assert(success);


    self.networkStream.delegate = self;
    [self.networkStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
    [self.networkStream open];

    // Have to release ftpStream to balance out the create.  self.networkStream 
    // has retained this for our persistent use.

    CFRelease(ftpStream);

    // Tell the UI we're sending.

    [self _sendDidStart];
}

}

В этом примере hostname - это IP-адрес для FTP-сервера. Проблема, которую я продолжаю получать, заключается в том, что мой NSLog(@"After url=") URL-адрес остается нулевым, и я не могу понять, почему он продолжает создаваться как нулевой. Кроме того, pngPath - это NSString, где находится изображение, которое я пытаюсь загрузить. Кто-нибудь знает простой способ редактирования их простого образца, который работает, потому что я занимался этим пару недель и просто не могу заставить его работать.

Кроме того, я не могу найти что-нибудь в их API, чтобы заставить его отправлять в пассивном режиме, кто-нибудь знает, как я мог заставить это работать также? Спасибо!

1 Ответ

0 голосов
/ 15 февраля 2012

Операции с NSString проблематичны для протокола схемы (например, "ftp: //"), потому что, как только вы измените вашу строку NSString, она заменит любую последовательность символов "/" уникальным "/".

Фактически, это становится проблематичным с «/», когда вы используете любую функцию «pathComponent» или «path» из класса NSString, которая будет возвращать не объект NSString, а объект класса NSPathStore2. Это тот класс (NSPathStore2), который делает забавные вещи с "/".

Затем, когда вы попытаетесь использовать его для создания NSURL, произойдет сбой, потому что начало адреса становится "ftp: /myhost/mypath/myfile.ext". Один "/" отсутствует после "ftp: /".

Чтобы избежать этой проблемы, вот что я сделал быстро:

NSString *myPath = [[@"ftp:%2F%2FmyFtpDomain/myPath" 
                                 stringByAppendingPathComponent:@"myFilename.ext"]
stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

Я избежал "/" при создании адреса по его экранированному коду% 2F и, наконец, удалил их.

Для пассивного режима используйте свойство 'kCFStreamPropertyFTPUsePassiveMode' вашего NSStream:

[_outputStream setProperty:( _passiveMode ? (id)kCFBooleanTrue : (id)kCFBooleanFalse ) forKey:(id)kCFStreamPropertyFTPUsePassiveMode]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...