IOS使用NSURLSession FTP上传

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

有一个着名的苹果开发者博客也支持。 但是还不清楚NSURLSession API是否支持ftp上传? (我尝试了build议的方式,并得到错误)。

使用CFFTPStreamRef的传统方法,ftp上传工作正常,但在9.0中不推荐使用。 头文件说: CF_DEPRECATED(10_3,10_11,2_0,9_0,“使用NSURLSessionAPI的FTP请求”)

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

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]; 

据我所知,NSURLSession(和NSURLConnection)支持通过FTP检索文件,但不支持任何其他的FTP命令,如STOR(注意PUT是一个HTTP方法,而不是FTP方法)。

为了您的目的,您的select是使用CFFTPStream API(它只能工作)或停止使用FTP。

我强烈的build议是停止使用FTP。 FTP协议是绝对不安全的,以明文forms通过线路发送用户名和密码,这使得人们很容易嗅探凭证并伪装成用户。 所以现在唯一一个FTP上传甚至可以被远程接受的情况是匿名的FTP上传到一个共享的保pipe箱,即使这样,它也有点可疑。 这就是为什么function永远不会被添加到NSURLConnection API,更不用说NSURLSession。

有很多更好的替代品,比如WebDAV over HTTPS,通过HTTPS的POST请求上传,带有摘要式validation的WebDAV或POST请求等等。而且这些替代scheme实际上可以通过NSURLSession来支持,并提供其他优点,如恢复能力下载。 除非你完全没有办法改变服务器端,否则请使用其中一种替代方法。