是否可以使用NSUrlSession将文件上传到FTP服务器?

时间:2017-10-31 16:44:28

标签: c# ftp xamarin.ios nsurlsession

我已经在网上搜索了几个小时,寻找解决我需要使用我正在开发的Xamarin.iOS应用解决的问题的解决方案。大多数(如果不是全部)我们在该领域的客户需要上传他们附加到工作单(票证)的图片,这些图片将在我们的后端发送到FTP。我的同事开发了Android应用程序,从他那里我采用了当前的方法,基于FtpRequest转换为FtpWebRequest。如果用户有良好的连接,它可以90%的时间工作,并且可以相当快地上传到服务器。

问题?我需要100%的时间,而且我需要它在后台。我发现NSUrlSession似乎是解决这个问题的最佳选择,因为它是iOS的原生并且支持后台处理。我唯一的问题是,当我尝试使用session.CreateUploadTask创建UploadTask时,它表示"无法读取文件(路径)"其中path为:file://var/mobile/Containers/Data/Application/850CB1FE-9C2D-456C-8B5F-921DC8D5CEF5/Documents/PolarisPictures2/VUPSXOUTA722002799CMC5022017103109544681088_1.jpeg。通过使用foreach( var file in Directory.EnumerateFiles(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "PolarisPictures2") )打印出文件名,我已经确认该文件确实存在于该路径上而不使用file://协议,错误将返回" ...不是有效的文件:// url。"那么我没有正确访问该文件,或者是否根本无法做我想做的事情?

如果没有办法,任何人都可以提供最能达到我需要的后台功能的解决方案吗?

赞赏它,伙计们。

感谢。

这是我的代码:

NSUrlSession session = null;
        NSUrlSessionConfiguration config = NSUrlSessionConfiguration.CreateBackgroundSessionConfiguration("com.PolarisFTPUpload.BackgroundSession");
        session = NSUrlSession.FromConfiguration(config, (NSUrlSessionDelegate)new MySessionDelegate(), new NSOperationQueue());
        string docs = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
        docs = docs.Replace("/var", "file://var");
        string filepath = System.IO.Path.Combine(docs, "PolarisPictures2/VUPSXOUTA722002799CMC5022017103109544681088_1.jpeg");
        Console.WriteLine(filepath);
        string UploadURLString = "ftp://myftpUser:myftpPass@myftpIP:Port/Pictures/Database" + "/" + DateTime.Today.Year + "/" + DateTime.Today.Month + "/" + DateTime.Today.Day + "/";
        NSUrlSessionUploadTask uploadTask;
        NSUrl uploadURL = NSUrl.FromString(UploadURLString);
        NSUrlRequest req = NSUrlRequest.FromUrl(uploadURL);
        uploadTask = session.CreateUploadTask(req, NSUrl.FromString(filepath));

2 个答案:

答案 0 :(得分:2)

应该有三个std::is_same前缀/。前缀应为file,而不是file:///

您可以使用file://获取此网址而不替换前缀。

答案 1 :(得分:2)

NSURLSession及其前身NSURLConnection都不支持FTP PUT命令。唯一支持FTP上传的Apple API是CFFTPStream,这是古老的,不赞成使用,并且强烈建议不要进行新的开发。

无论哪种方式,您都不应该在任何情况下使用FTP。期。从根本上讲,不可能使FTP安全,因为密码是通过网络以明文形式发送的。

相反,您应该在Web服务器上编写一小段PHP代码,接受文件上传,并使用HTTPS上传。这种方法不仅更安全,而且NSURLSession也支持它。

有关网站的更多信息,请参阅Secure PHP File Upload Script,有关iOS上传的帮助,请参阅Apple的NSURLSession编程指南。