【问题标题】:ios FTP upload using NSURLSessionios FTP上传使用NSURLSession
【发布时间】:2016-02-28 19:23:51
【问题描述】:

我正在尝试通过 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, "Use NSURLSessionAPI for ftp requests")

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

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

【问题讨论】:

    标签: ios ftp nsurlsession


    【解决方案1】:

    据我所知,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 支持,并提供其他优势,例如恢复下载的能力。除非您绝对无法更改服务器端,否则请改用其中一种替代方法。

    【讨论】:

    • NSURLSession 文档很难弄清楚它在 FTP 上支持什么以及如何支持。这是来自 Apple 的不太好的文档的一个很好的例子。
    • 不幸的是,有人想到了为 Core Foundation FTP API 添加弃用警告的好主意,这意味着您可以用 NSURLSession 替换它们。那是一个严重的错误。不过,为了捍卫文档,我怀疑是否有人考虑过有人仍会尝试使用 FTP 上传 文件的可能性。 20 年前 前,这被认为是一种非常糟糕的安全做法——以至于如果 Apple 在不久的将来完全取消对 FTP 上传的支持,我不会感到惊讶,因为它只是应该永远做不完。
    • 我有点厌倦了编码人员一直沉迷于 FTP 的攻击。安全问题是一个红鲱鱼 - 使用 FTP over TLS!!!而且根本没有充分的理由将其扔进垃圾箱……例如,大多数网络主机仍然只提供 FTP 工具来上传网站内容。如果它停止工作,我们会在哪里,嗯?
    • 我配置了活动的 FTP 服务器。但是得到的错误是 Error Domain=NSURLErrorDomain Code=-1102 "You don't have permission to access the requested resource."。如何在 NSInputStream API 中使用 kCFStreamPropertyFTPUsePassiveMode 设置为活动服务器。用户名、密码设置正确。
    • @dgatwood 但我确信我的 IP 地址在防火墙中被列入白名单。我可以在活动模式下使用cyberduck 或filezilla 下载,但是以编程方式我无法下载。
    猜你喜欢
    • 1970-01-01
    • 2018-04-12
    • 2014-02-14
    • 1970-01-01
    • 1970-01-01
    • 2013-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多