2017-03-06 8 views
2

저는 Xamarin과 C# world에서 새로 왔으며 FTP 서버에 이미지를 업로드하려고합니다. 나는 이것을하기 위해 FtpWebRequest 클래스를 보았지만 정확하게 이해하지 못하고, plataform 특정 코드를 삽입하는 법을 모르며, 그것이 실제로 무엇을 의미하는지조차 알지 못한다. 이미이 비디오 (https://www.youtube.com/watch?feature=player_embedded&v=yduxdUCKU1c)를 보았지만 나는 돈을 내지 않는다. 이것을 사용하여 FtpWebRequest 클래스를 만들고 이미지를 업로드하는 방법을 알지 못합니다.PCL Xamarin 양식을 사용하여 FTP 서버에 이미지 업로드

나는 그림을 보내려면이 코드 (여기 : https://forums.xamarin.com/discussion/9052/strange-behaviour-with-ftp-upload)를 보았고 사용할 수 없습니다.

public void sendAPicture(string picture) 
{ 

    string ftpHost = "xxxx"; 

    string ftpUser = "yyyy"; 

    string ftpPassword = "zzzzz"; 

    string ftpfullpath = "ftp://myserver.com/testme123.jpg"; 

    FtpWebRequest ftp = (FtpWebRequest)FtpWebRequest.Create(ftpfullpath); 

    //userid and password for the ftp server 

    ftp.Credentials = new NetworkCredential(ftpUser, ftpPassword); 

    ftp.KeepAlive = true; 
    ftp.UseBinary = true; 
    ftp.Method = WebRequestMethods.Ftp.UploadFile; 

    FileStream fs = File.OpenRead(picture); 

    byte[] buffer = new byte[fs.Length]; 
    fs.Read(buffer, 0, buffer.Length); 

    fs.Close(); 

    Stream ftpstream = ftp.GetRequestStream(); 
    ftpstream.Write(buffer, 0, buffer.Length); 
    ftpstream.Close(); 
    ftpstream.Flush(); 

    // fs.Flush(); 

} 

내가 타입하여 FileStream, WebRequestMethods 및 파일이없는, 또한 "내에서는 FtpWebRequest 클래스는"KeepAlive를 ","UseBinary "와"GetRequestStream "방법을 가지고 넣은 사람은 아니다 내 스트림 클래스는 없습니다 닫기 "방법.

내에서는 FtpWebRequest 클래스 :

공공 봉인 클래스에서는 FtpWebRequest : WebRequest 클래스 { 공공 재정의 문자열의 ContentType { 얻을 { 던져 새로운 NotImplementedException(); }

set 
    { 
     throw new NotImplementedException(); 
    } 
} 

public override WebHeaderCollection Headers 
{ 
    get 
    { 
     throw new NotImplementedException(); 
    } 

    set 
    { 
     throw new NotImplementedException(); 
    } 
} 

public override string Method 
{ 
    get 
    { 
     throw new NotImplementedException(); 
    } 

    set 
    { 
     throw new NotImplementedException(); 
    } 
} 

public override Uri RequestUri 
{ 
    get 
    { 
     throw new NotImplementedException(); 
    } 
} 

public override void Abort() 
{ 
    throw new NotImplementedException(); 
} 

public override IAsyncResult BeginGetRequestStream(AsyncCallback callback, object state) 
{ 
    throw new NotImplementedException(); 
} 

public override IAsyncResult BeginGetResponse(AsyncCallback callback, object state) 
{ 
    throw new NotImplementedException(); 
} 

public override Stream EndGetRequestStream(IAsyncResult asyncResult) 
{ 
    throw new NotImplementedException(); 
} 

public override WebResponse EndGetResponse(IAsyncResult asyncResult) 
{ 
    throw new NotImplementedException(); 
} 

}

(나는 내가 거기에 쓸 것을 모르기 때문에. 난 그냥 CTRL +를 누르면, 거기에 아무것도 작성하지 않았다, 알고)

사람이 제공 할 수 있습니까 나 FtpWebRequest 클래스의 전체 예제? 나는 단지 위의 것과 같이 사용중인 클래스를 찾는다.

답변

2

좋아, 내가 어떻게하는지 알아 냈어. 내가 어떻게했는지를 보여줄거야. 나는 더 잘하고 올바른 방법이 있는지 정말로 모르지만, 효과가있다. 내가 IFtpWebRequest를 구현하는 클래스 caled FTP를 작성했다/드로이드 프로젝트 내 아이폰 OS 내부

namespace Contato_Vistoria 
{ 
     public interface IFtpWebRequest 
     { 
      string upload(string FtpUrl, string fileName, string userName, string password, string UploadDirectory = ""); 
     } 
} 

다음 :

먼저 나는 정확히이 포함되어 내 양식 프로젝트에 IFtpWebRequest라는 인터페이스 클래스를 생성했다

using System; 
using System.IO; 
using System.Net; 
using Contato_Vistoria.Droid; //My droid project 

[assembly: Xamarin.Forms.Dependency(typeof(FTP))] //You need to put this on iOS/droid class or uwp/etc if you wrote 
namespace Contato_Vistoria.Droid 
{ 
    class FTP : IFtpWebRequest 
    { 
     public FTP() //I saw on Xamarin documentation that it's important to NOT pass any parameter on that constructor 
     { 
     } 

     /// Upload File to Specified FTP Url with username and password and Upload Directory if need to upload in sub folders 
     ///Base FtpUrl of FTP Server 
     ///Local Filename to Upload 
     ///Username of FTP Server 
     ///Password of FTP Server 
     ///[Optional]Specify sub Folder if any 
     /// Status String from Server 
     public string upload(string FtpUrl, string fileName, string userName, string password, string UploadDirectory = "") 
     { 
      try 
      { 

       string PureFileName = new FileInfo(fileName).Name; 
       String uploadUrl = String.Format("{0}{1}/{2}", FtpUrl, UploadDirectory, PureFileName); 
       FtpWebRequest req = (FtpWebRequest)FtpWebRequest.Create(uploadUrl); 
       req.Proxy = null; 
       req.Method = WebRequestMethods.Ftp.UploadFile; 
       req.Credentials = new NetworkCredential(userName, password); 
       req.UseBinary = true; 
       req.UsePassive = true; 
       byte[] data = File.ReadAllBytes(fileName); 
       req.ContentLength = data.Length; 
       Stream stream = req.GetRequestStream(); 
       stream.Write(data, 0, data.Length); 
       stream.Close(); 
       FtpWebResponse res = (FtpWebResponse)req.GetResponse(); 
       return res.StatusDescription; 

      } 
      catch(Exception err) 
      { 
       return err.ToString(); 
      } 
     } 
    } 
} 

그것은 꽤 많이 내 아이폰 OS 프로젝트에 동일합니다,하지만 난에 어쨌든 게시합니다 : 그 클래스 안에 내가 업로드 기능을 (지금은 다른 일을 사용하고 있습니다), 여기에 전체 FTP 클래스의 작성 내게 너무 많이 알 필요가 없으며 도움이 필요한 사람들을 도우 라. 그것을 어떻게하는지에 대한 완전한 예를 들어보십시오. 여기있다 :

using System; 
using System.Net; 
using System.IO; 
//Only thing that changes to droid class is that \/ 
using Foundation; 
using UIKit; 
using Contato_Vistoria.iOS; 


[assembly: Xamarin.Forms.Dependency(typeof(FTP))] 
namespace Contato_Vistoria.iOS // /\ 
{ 
    class FTP : IFtpWebRequest 
    { 
     public FTP() 
     { 

     } 

     /// Upload File to Specified FTP Url with username and password and Upload Directory if need to upload in sub folders 
     ///Base FtpUrl of FTP Server 
     ///Local Filename to Upload 
     ///Username of FTP Server 
     ///Password of FTP Server 
     ///[Optional]Specify sub Folder if any 
     /// Status String from Server 
     public string upload(string FtpUrl, string fileName, string userName, string password, string UploadDirectory = "") 
     { 
      try 
      { 
       string PureFileName = new FileInfo(fileName).Name; 
       String uploadUrl = String.Format("{0}{1}/{2}", FtpUrl, UploadDirectory, PureFileName); 
       FtpWebRequest req = (FtpWebRequest)FtpWebRequest.Create(uploadUrl); 
       req.Proxy = null; 
       req.Method = WebRequestMethods.Ftp.UploadFile; 
       req.Credentials = new NetworkCredential(userName, password); 
       req.UseBinary = true; 
       req.UsePassive = true; 
       byte[] data = File.ReadAllBytes(fileName); 
       req.ContentLength = data.Length; 
       Stream stream = req.GetRequestStream(); 
       stream.Write(data, 0, data.Length); 
       stream.Close(); 
       FtpWebResponse res = (FtpWebResponse)req.GetResponse(); 
       return res.StatusDescription; 

      } 
      catch (Exception err) 
      { 
       return err.ToString(); 
      } 
     } 
    } 
} 

마지막으로, 다시 내 자 마린 양식 프로젝트에,이 내가 함수를 호출하는 방법입니다.

protected async void btConcluidoClicked(object sender, EventArgs e) 
    { 
     if (Device.OS == TargetPlatform.Android || Device.OS == TargetPlatform.iOS) 
      await DisplayAlert("Upload", DependencyService.Get<IFtpWebRequest>().upload("ftp://ftp.swfwmd.state.fl.us", ((ListCarImagesViewModel)BindingContext).Items[0].Image, "Anonymous", "[email protected]", "/pub/incoming"), "Ok"); 

     await Navigation.PopAsync(); 
    } 

이 좀 더 구체적으로, ". DependencyService.Get() YourFunction (함수의 매개 변수)"를 쓸 필요가 함수를 호출하려면 : 내 GUI에서 버튼의 간단한 클릭 이벤트 내부.

그게 내가 한 것처럼, 내가 누군가를 도울 수 있기를 바랍니다.