我已经在网上搜索了几个小时,寻找解决我需要使用我正在开发的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));
答案 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编程指南。