iOS FTPManager的簡單使用及常見問題

LinXunFeng發表於2019-02-28

FTP是一個重要的檔案傳輸協議,在電腦上比較常用些,今天介紹一下iOS上一個好用的FTPManager

簡介

FTPManager 是一個很方便的第三方FTP工具,使用它我們可以輕鬆的使用ftp協議傳輸檔案到伺服器;當然,增刪改查都可以,不過下面只介紹下上傳的步驟,其它的大同小異~

程式碼

// 匯入標頭檔案
#import "FTPManager.h"
複製程式碼

定義FTP地址,使用者名稱和密碼

#define FTPURL        @"192.168.1.1"
#define FTPUsername   @"abc123"
#define FTPPSW        @"abc123"
複製程式碼
@implementation ViewController{
    FMServer* server;
    FTPManager* man; 
    NSString* filePath;  // 上傳檔案的路徑
    BOOL succeeded;  // 記錄傳輸結果是否成功
    NSTimer* progTimer;  
}

- (void)viewDidLoad {
    [super viewDidLoad];

    // 上傳檔案
    [self uploadWithftpUrl:FTPURL ftpUsr:FTPUsername ftpPass:FTPPSW];
}
// 上傳
-(void)uploadWithftpUrl:(NSString*)url ftpUsr:(NSString*)user ftpPass:(NSString*)pass {
    // 配置FTP伺服器資訊
    server = [FMServer serverWithDestination:url username:user password:pass];
    // 初始化定時器
    progTimer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(changeProgress) userInfo:nil repeats:YES];
    // 啟用定時器
    [progTimer fire];
    // 呼叫開始上傳檔案的方法
    [self performSelectorInBackground:@selector(startUploading) withObject:nil];
}

-(void)startUploading {
    // 初始化FTPManager
    man = [[FTPManager alloc] init];
    // 設定代理(非必須)
    man.delegate = self;
    
//    server.port = 21;  // 可以指定FTP埠
    
    //建立上傳檔案
    UIImage *img = [UIImage imageNamed:@"abc"];
    NSData * data = UIImagePNGRepresentation(img);
    // 開始上傳並記錄結果
    succeeded = [man uploadData:data withFileName:@"20173160007.png" toServer:server];
    
//    NSString *path = @"/Users/lxf/Desktop/1114.txt";
//    NSURL *fileUrl = [NSURL URLWithString:path];
//    succeeded = [man uploadFile:fileUrl toServer:server];
    
    [self performSelectorOnMainThread:@selector(uploadFinished) withObject:nil waitUntilDone:NO];
}
-(void)changeProgress {
    if (!man) {
        [progTimer invalidate];
        progTimer = nil;
        return;
    }
    NSLog(@"上傳進度:%@",man.progress);
}
// 上傳完畢,一切置空
-(void)uploadFinished {
    [progTimer invalidate];
    progTimer = nil;
    filePath = nil;
    server = nil;
    man = nil;
}
@end
複製程式碼

代理方法

#pragma mark - FTPManagerDelegate
- (void)ftpManagerUploadProgressDidChange:(NSDictionary *)processInfo {
    NSLog(@"%@", processInfo);
}
複製程式碼

常見錯誤

(ftp stream failed: general stream error (check credentials?)

出現這個錯誤的情況,我遇到的有兩種情景

  • 一、檔案已存在
    簡單來說,我們給需要上傳的檔案起的名字,在伺服器對應的路徑下已經存在,改個名字再傳一遍就好。

  • 二、伺服器問題
    與後臺的同事溝通後無果,因為我們得知的錯誤就只有上面的那個提示,並其它的資訊,也就無法給後臺同事更多的資訊。我也試過在原始碼裡一路追蹤下去,只知道它在開啟流的時候失敗了。所以我就試了一下終端來進行FTP的操作

先連線好FTP伺服器,輸入dir檢視目錄,這時120伺服器(就是120開頭的ip)的目錄一下子就出來了。

120伺服器

再來看211伺服器這邊,敲完指令就卡住在這了,而且我們發現ip地址不對,是內網的ip

211伺服器

過了20秒左右列表就列出來了,但是報200

211伺服器 200

截圖給後臺同事一看就明瞭了,修復完就可以用了,具體怎麼解決我也不知道,畢竟我不是從事這一方向的,也沒參與後臺的工作。

同事給出的解釋:FTP主動 被動模式,需要設定傳輸鏈路的地址和埠

有興趣的可以看下200如何解決:200 PORT command successful. Consider using PASV

相關文章