2017-10-31 2 views
0

저는 개발중인 Xamarin.iOS 응용 프로그램으로 해결해야하는 문제에 대한 해결책을 찾기 위해 몇 시간 동안 웹을 수색했습니다. 현장에있는 대부분의 고객은 우리의 백엔드에있는 FTP로 이동하는 작업 주문 (티켓)에 첨부 된 사진을 업로드해야합니다. 동료가 Android 앱을 개발했으며 FtpRequest를 FtpWebRequest에 캐스팅 한 현재 방법을 사용했습니다. 사용자가 괜찮은 연결을 가지고 있으면 서버는 90 %의 시간 동안 작동하고 서버에 업로드됩니다.NSUrlSession을 사용하여 파일을 FTP 서버에 업로드 할 수 있습니까?

문제가 있습니까? 100 % 시간이 필요하며 배경에 있어야합니다. 나는 NSUrlSession이 iOS에 고유하고 backgrounding에 대한 지원을 가지고 있기 때문에이 문제를 해결하는 최선의 방법 인 것으로 나타났습니다. 내 유일한 문제는 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 valid file : // url."과 함께 오류가 반환됩니다. 그래서 파일에 제대로 액세스하지 못하거나 아니면 단순히 수행하려는 작업을 수행 할 방법이 없다는 것입니까?

아무런 방법이 없다면 누구나 내가 필요한 backgrounding 기능을 가장 잘 달성 할 수있는 솔루션을 제공 할 수 있습니까?

감사합니다.

감사합니다.

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 코드를 작성해야합니다. 이 접근법이 더 안전 할뿐만 아니라 NSURLSession에서도 지원됩니다.

웹 사이트에 대한 자세한 내용은 Secure PHP File Upload Script을 참조하고 iOS 측에서 업로드하는 방법에 대한 도움말은 Apple의 NSURLSession 프로그래밍 가이드를 참조하십시오.

+0

들었습니다. 그래, 불행하게도 그 결정의 중재자는 아니야, 형.Apple의 설명서를 읽은 며칠 후 100 % 정확하며 마침내 내 HTTP 게시물 업로드 작업을 마쳤다고 말할 것입니다. .NET 웹 API를 사용하여 FTP 대신 여기에 내 응용 프로그램의 기능을 훨씬 더 많이 포함하게되었습니다. 우리는 소프트웨어의 일부 구식 부분을 가지고 있으며, 나는 그것이 변해야한다고 동의합니다. 그래도 고마워! 확실히 질문에 대한 적절한 대답. –

2

/ 접두사 file과를가 있어야한다 :

여기 내 코드입니다. 접두어는 file:///이어야하며 file://이 아니어야합니다.

접두어를 바꾸지 않고이 URL을 얻으려면 NSUrl.FromFilename(filepath)을 사용해도됩니다.

+0

답장을 보내 주셔서 감사합니다. 나는 3 개의 슬래시가 이상하게 보였다고 생각했다. 그러나 어제 일부 파기 후에 그것은 도대체라고 말하고 그것을 시도했다. 당신 말이 맞았지만 FromFilename 방법에 대해서는 몰랐습니다. 감사합니다. 내가하려고하는 것이 가능하다는 것은 나타나지 않습니다. 내 문제에 대한 유일한 해결책은 aspx 양식을 코딩 한 다음 올바른 양식 데이터로 NSUrlSession.CreateUploadTask를 통해 게시하는 것입니다. –

+1

URLSession을 사용하여 파일을 업로드하는 방법에 대한 Apple의 문서가 있습니다. POST http 메서드를 사용합니다. 필요할 수 있습니다. https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/URLLoadingSystem/Articles/UsingNSURLSession.html#//apple_ref/doc/uid/TP40013509-SW28 –

관련 문제