【问题标题】:Is it possible to use NSUrlSession to upload files to an FTP server?是否可以使用 NSUrlSession 将文件上传到 FTP 服务器?
【发布时间】: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


    【解决方案1】:

    NSURLSession 及其前身 NSURLConnection 都不支持 FTP PUT 命令。唯一支持 FTP 上传的 Apple API 是 CFFTPStream,它是古老的、已弃用的,并且强烈反对新的开发。

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

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

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

    【讨论】:

    • 我听到了,但很遗憾,我不是那个决定的仲裁者,兄弟。在阅读 Apple 的文档几天后,我会说你是 100% 正确的,并且终于让我的 HTTP 后上传工作正常了。我使用了一个 .NET Web API 来执行此操作,并且希望在这里包含我的应用程序的更多功能,而不是 FTP。我同意,我们的软件有一些过时的部分需要更改。不过谢谢!绝对是问题的正确答案。
    【解决方案2】:

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

    您可以直接使用NSUrl.FromFilename(filepath) 获取此网址,而无需替换前缀。

    【讨论】:

    • 感谢您的回复。我认为这三个斜线看起来很奇怪,但在昨天挖了一些之后说到底是什么并试了一下。你是对的,但我不知道 FromFilename 方法,所以谢谢。看来我正在尝试做的事情是不可能的。似乎我的问题的唯一解决方案是编写一个 aspx 表单,然后通过 NSUrlSession.CreateUploadTask 使用适当的表单数据发布到其中。
    • Apple 提供了一个关于使用 URLSession 上传文件的文档,它使用 POST http 方法。这可能是您需要的东西:developer.apple.com/library/content/documentation/Cocoa/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-14
    • 2016-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多