2015年12月29日 星期二

iOS筆記:NSURLSession for ftp requests: get file list

因為個人有強迫症,既然apple都說CFFTPStream要用NSURLSession取代,那就改吧——
但是連apple自己的sample code都是用CFFTPStream(⋯⋯)
那⋯⋯只⋯⋯好⋯⋯自⋯⋯己⋯⋯來⋯⋯了(覺得很麻煩的語氣)


1、先弄出一個HTTP GET的範例,然把把網址改掉。
把HTTP改成FTP,server domin改成你要的ip
啊帳號密碼在哪設定? 通通塞在網址裡!
於是就成了這樣:
ftp://account:password@192.168.0.1/
(192.168.0.1是 FTP server IP)
(FTP server是開著的話把這串網址丟到瀏覽器上就能看到清單了)

-(void)connectFTP
{
    NSString * ftpUrl = @"ftp://account:password@192.168.0.1/";
    NSURLSession *session = [NSURLSession sharedSession];
    
    NSURLSessionDataTask *connTask = [session dataTaskWithURL:[NSURL URLWithString: ftpUrl] completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
        NSString* resultStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
        NSLog(@"======resultStr=====\n%@",resultStr);
        NSArray *separatedItems = [resultStr componentsSeparatedByString:@"\r\n"];
        NSLog(@"======separatedItems=====\n%@",separatedItems);
    }];
    [connTask resume];//start with connect
}

2、有了網址就送一個封包出去,看看會拿到些什麼東西
把data轉成NSString,印出來

NSString* resultStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"======resultStr=====\n%@",resultStr);

總算get到清單啦

FTPDemo[83213:2017438]======resultStr=====
drwxrwxrwx               folder        0 Dec 25 18:02 abc
-rw-rw-rw-        0       89460    89460 Nov 18 15:31 6196e48.jpg
drwxrwxrwx               folder        0 Dec 24 12:29 Library
d(目錄)rwx rwx rwx(三種所有者存取權)
0(不是資料夾)
89460(檔案位元數),folder(這是資料夾)
Dec 25 18:02(最後修改時間)
6196e48.jpg(文件名),abc(資料夾名)

一堆空白作為分隔,一行的結尾是\r\n
第二欄位的1不會顯示,what⋯⋯

哎上面那個是測試用的FTP server,這暫時不是我的重點。
今天需要用app從裝置上抓下FTP檔案到本機來,那就⋯⋯繼續


3、先把data string用換行切開來存成array:

NSArray *separatedItems = [resultStr componentsSeparatedByString:@"\r\n"];

然後分析字串。(眼神死)
這是這篇用的範例:
-rwxr-xr-x    1 0        0         7052920 Dec 25 15:58 ch_15122511.jpg

4、切開字串
今天還是用NSRegularExpression,詳情在這
app需要的重點只有後半段的檔案大小、時間、檔案名稱
至於3那邊多切出來的只有換行的index在這步驟裡會被過濾掉,不用擔心
主要是「\\s+」,不用擔心會有多出來的空格
(反正只要是多於一個的空格通通都在接收範圍內)

+ (NSMutableArray *)parseFTPstring:(NSArray*)ftpFileArray {
    NSMutableArray * result = [[NSMutableArray alloc] init];
    NSMutableDictionary * fileDictionary ;
    for (NSString * string in ftpFileArray) {
        NSString *pattern = @"([-rwx]+\\s+\\d\\s+\\d\\s+\\d\\s+)(\\d+) (\\w{3}\\s\\d{2}\\s\\d{2}:\\d{2}) (ch_[\\d]+\\.jpg)";
        NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:pattern options:0 error:NULL];
        NSTextCheckingResult *match = [regex firstMatchInString:string options:0 range:NSMakeRange(0, [string length])];
        if (match != nil) {
            fileDictionary = [[NSMutableDictionary alloc] init];
            
            [fileDictionary setObject:[string substringWithRange:[match rangeAtIndex:2]] forKey:@"fileSize"];
            [fileDictionary setObject:[string substringWithRange:[match rangeAtIndex:3]] forKey:@"fileDate"];
            [fileDictionary setObject:[string substringWithRange:[match rangeAtIndex:4]] forKey:@"fileName"];
            
            [result addObject:fileDictionary];
            
            NSLog(@"%@",fileDictionary);
        }
    }
    return result;
}

[match rangeAtIndex:1]是權限跟三個布林值,沒有用所以不在code上
----
測一測發現裝置隔天FTP回傳格式居然變了
照理論來說,上次修改日期應該是年月日時分,時分跟年份在data中佔的是一樣的位置(⋯⋯)
-rwxr-xr-x    1 0        0         7980136 Dec 28  2015 ch_15122842.jpg
於是pattern改成了
NSString *pattern = @"([-rwx]+\\s+\\d\\s+\\d\\s+\\d\\s+)(\\d+) (\\w{3}\\s\\d{2}\\s+[\\d:]{3,5}) (ch_[\\d]+\\.jpg)";
這樣。(很想偷懶)
因為每個參數都有空格隔開的緣故所以能這樣弄(笑


沒有留言:

張貼留言