iOS - FTPManager的简单使用及常见问题

作者: LinXunFeng | 来源:发表于2017-03-21 22:32 被阅读6393次

    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

    欢迎关注微信公众号:linxunfengtop

    相关文章

      网友评论

        本文标题:iOS - FTPManager的简单使用及常见问题

        本文链接:https://www.haomeiwen.com/subject/bdqnnttx.html