【发布时间】:2018-04-12 22:03:21
【问题描述】:
我已经在网上搜索了几个小时,以寻找我需要使用我一直在开发的 Xamarin.iOS 应用程序解决的问题的解决方案。我们在现场的大多数(如果不是全部)客户需要上传他们附加到工作订单(票证)的图片,这些图片会发送到我们后端的 FTP。我的同事开发了 Android 应用程序,我从他那里采用了当前方法,基于转换为 FtpWebRequest 的 FtpRequest。如果用户有良好的连接,它 90% 的时间都能正常工作,并且相当快地上传到服务器。
问题?我需要 100% 的时间,而且我需要它在后台。我发现 NSUrlSession 似乎是解决这个问题的最佳选择,因为它是 iOS 原生的并且支持后台。我唯一的问题是,当我尝试使用session.CreateUploadTask 创建 UploadTask 时,它显示“无法在(路径)读取文件”,其中路径为: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:// 协议,错误返回“...不是有效的 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));
【问题讨论】:
标签: c# ftp xamarin.ios nsurlsession