2017-10-31 22 views
0

私は開発しているXamarin.iOSアプリケーションで解決する必要がある問題の解決策を探して、数時間Webを精査してきました。現場の顧客のほとんどではないにしても、私たちのバックエンドのFTPに行く作業指示(チケット)に添付する写真をアップロードする必要があります。私の同僚はAndroidアプリを開発し、FtpWebRequestにキャストされたFtpRequestに基づいて、現在の方法を採用しました。ユーザーがまともな接続をしている場合、サーバーは90%の時間で正常に動作し、サーバーにアップロードされます。ファイルをFTPサーバーにアップロードするのにNSUrlSessionを使用できますか?

問題がありますか?私は時間の100%を必要とし、私はそれがバックグラウンドにあることが必要です。私はNSUrlSessionがiOSにネイティブでバックグラウンドをサポートしているので、この問題を解決するためにNSUrlSessionが最善の策であるとわかりました。私の唯一の問題は、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://プロトコルを使用しないと、「... is not a valid 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:[email protected]: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

NSURLSessionもその前身であるNSURLConnectionも、FTP PUTコマンドをサポートしていません。 FTPアップロードをサポートする唯一のApple APIはCFFTPStreamです。CFFTPStreamは古くから非難されており、新しい開発のために強く推奨されていません。

いずれにしても、FTPを使用しないでください。期間。パスワードはネットワーク経由で平文で送信されるため、FTPを安全にすることは基本的に不可能です。

代わりに、ファイルアップロードを受け入れ、HTTPSアップロードを使用する簡単なPHPコードをWebサーバーに書き込む必要があります。このアプローチはより安全であるばかりでなく、NSURLSessionでもサポートされています。

ウェブサイトの詳細については、Secure PHP File Upload Scriptを、iOS側のアップロードについては、AppleのNSURLSession Programming Guideを参照してください。

+0

私は聞くああ、残念ながら私はその決定の仲裁人ではありませんが、兄です。アップルのドキュメンテーションを読んで数日後にあなたが100%正しいと言い、最終的に私のHTTPポストアップロードが動作すると言います。私は.NET Web APIを使ってこれを行いました。ここではFTPよりもはるかに多くのアプリケーションの機能を網羅しています。私たちは、私の同意するソフトウェアの古い部分をいくつか変更する必要があります。ありがとう、しかし!間違いなく、質問に対する適切な答え。 –

2

file接頭辞で3 /があるはずです。プレフィックスはfile:///で、file://ではありません。

プレフィックスを置き換えずにこのURLを取得するには、NSUrl.FromFilename(filepath)を使用します。

+0

返信いただきありがとうございます。私は3つのスラッシュが奇妙に見えたと思っていましたが、昨日の掘り出し物の後に何があったのかを試してみました。あなたは正しかったが、私はFromFilenameメソッドについて知らなかったので、ありがとう。私がしようとしていることが可能であるとは思われません。私の問題の唯一の解決策はaspxフォームをコーディングし、適切なフォームデータを持つ 'NSUrlSession.CreateUploadTask'を使ってポストすることです。 –

+1

URLSessionを使用してファイルをアップロードする方法についてはAppleのdocがあります.HTTPSessionを使用しています。それはあなたが必要なものかもしれません:https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/URLLoadingSystem/Articles/UsingNSURLSession.html#//apple_ref/doc/uid/TP40013509-SW28 –

関連する問題