使用NSURLSession

时间:2015-11-25 20:43:50

标签: ios ftp nsurlsession

我正在尝试通过FTP将文件上传到服务器。根据 Apple Documentation NSURLSession类支持FTP操作。

有一个着名的Apple Developer blog也支持它。但是还不清楚NSURLSession API是否支持ftp上传? (我尝试了建议的方式并得到错误)。

使用CFFTPStreamRef的传统方式,ftp上传工作正常,但在9.0中已弃用。标题说: CF_DEPRECATED(10_3,10_11,2_0,9_0,“对ftp请求使用NSURLSessionAPI”)

获取帮助的任何想法,示例或链接。我现在正在尝试这样的事情:

NSURL *url_upload = [NSURL URLWithString:@"ftp://username:password@thelink/myfolder/filename.zip"];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url_upload];
    [request setHTTPMethod:@"PUT"];
NSURL *docsDirURL = [NSURL fileURLWithPath:filePath];

NSURLProtectionSpace * protectionSpace = [[NSURLProtectionSpace alloc] initWithHost:url_upload.host port:[url_upload.port integerValue] protocol:url_upload.scheme realm:nil authenticationMethod:nil];

NSURLCredential *cred = [NSURLCredential
                         credentialWithUser:userId
                         password:password
                         persistence:NSURLCredentialPersistenceForSession];


NSURLCredentialStorage * cred_storage ;
[cred_storage setCredential:cred forProtectionSpace:protectionSpace];
NSURLSessionConfiguration *sessionConfig = [NSURLSessionConfiguration defaultSessionConfiguration];
sessionConfig.URLCredentialStorage = cred_storage;
sessionConfig.timeoutIntervalForRequest = 30.0;
sessionConfig.timeoutIntervalForResource = 60.0;
sessionConfig.allowsCellularAccess = YES;
sessionConfig.HTTPMaximumConnectionsPerHost = 1;
NSURLSession *upLoadSession = [NSURLSession sessionWithConfiguration:sessionConfig delegate:self delegateQueue:nil];
NSURLSessionUploadTask *uploadTask = [upLoadSession uploadTaskWithRequest:request fromFile:docsDirURL];
[uploadTask resume];

1 个答案:

答案 0 :(得分:4)

就我的记忆而言,NSURLSession(和NSURLConnection)支持通过FTP检索文件,但不支持任何其他FTP命令,例如STOR(请注意,PUT是HTTP方法,而不是FTP方法)。

出于您的目的,您可以选择使用CFFTPStream API(几乎不起作用)或停止使用FTP。

我强烈建议停止使用FTP。 FTP协议是绝对不安全的,通过线路以明文形式发送用户名和密码,这使得人们很容易嗅到凭证并伪装成用户。因此,目前FTP上传甚至可以远程接受的唯一情况是匿名FTP上传到共享保管箱,即使这样,它也有点可疑。这就是为什么从未将功能添加到NSURLConnection API中的原因,更不用说NSURLSession了。

有更好的替代品更加安全,例如基于HTTPS的WebDAV,通过HTTPS的POST请求上传,WebDAV或带有摘要式身份验证的POST请求等。而这些替代方案实际上可以通过NSURLSession支持并提供其他优势,例如恢复下载的能力。除非您完全无法更改服务器端,否则请使用其中一种替代方案。