[c#] C #을 사용하여 FTP에 파일 업로드

C #으로 FTP 서버에 파일을 업로드하려고합니다. 파일이 업로드되지만 바이트는 0입니다.

private void button2_Click(object sender, EventArgs e)
{
    var dirPath = @"C:/Documents and Settings/sander.GD/Bureaublad/test/";

    ftp ftpClient = new ftp("ftp://example.com/", "username", "password");

    string[] files = Directory.GetFiles(dirPath,"*.*");

    var uploadPath = "/httpdocs/album";

    foreach (string file in files)
    {
        ftpClient.createDirectory("/test");

        ftpClient.upload(uploadPath + "/" + Path.GetFileName(file), file);
    }

    if (string.IsNullOrEmpty(txtnaam.Text))
    {
        MessageBox.Show("Gelieve uw naam in te geven !");
    }
}



답변

기존 답변은 유효하지만 이미 FTP 업로드를 깔끔하게 구현 WebRequest하면서 바퀴를 다시 발명하고 하위 수준 유형으로 귀찮게하는 이유는 무엇입니까?WebClient

using (var client = new WebClient())
{
    client.Credentials = new NetworkCredential(ftpUsername, ftpPassword);
    client.UploadFile("ftp://host/path.zip", WebRequestMethods.Ftp.UploadFile, localFile);
}


답변

public void UploadFtpFile(string folderName, string fileName)
{

    FtpWebRequest request;

    string folderName;
    string fileName;
    string absoluteFileName = Path.GetFileName(fileName);

    request = WebRequest.Create(new Uri(string.Format(@"ftp://{0}/{1}/{2}", "127.0.0.1", folderName, absoluteFileName))) as FtpWebRequest;
    request.Method = WebRequestMethods.Ftp.UploadFile;
    request.UseBinary = 1;
    request.UsePassive = 1;
    request.KeepAlive = 1;
    request.Credentials =  new NetworkCredential(user, pass);
    request.ConnectionGroupName = "group";

    using (FileStream fs = File.OpenRead(fileName))
    {
        byte[] buffer = new byte[fs.Length];
        fs.Read(buffer, 0, buffer.Length);
        fs.Close();
        Stream requestStream = request.GetRequestStream();
        requestStream.Write(buffer, 0, buffer.Length);
        requestStream.Flush();
        requestStream.Close();
    }
}

사용하는 방법

UploadFtpFile("testFolder", "E:\\filesToUpload\\test.img");

당신의 foreach에서 이것을 사용하십시오

폴더를 한 번만 생성하면됩니다.

폴더를 만들려면

request = WebRequest.Create(new Uri(string.Format(@"ftp://{0}/{1}/", "127.0.0.1", "testFolder"))) as FtpWebRequest;
request.Method = WebRequestMethods.Ftp.MakeDirectory;
FtpWebResponse ftpResponse = (FtpWebResponse)request.GetResponse();


답변

가장 쉬운 방법

.NET 프레임 워크를 사용하여 FTP 서버에 파일을 업로드하는 가장 간단한 방법은 WebClient.UploadFilemethod를 사용 하는 것입니다 .

WebClient client = new WebClient();
client.Credentials = new NetworkCredential("username", "password");
client.UploadFile("ftp://ftp.example.com/remote/path/file.zip", @"C:\local\path\file.zip");

고급 옵션

더 큰 제어가 필요 WebClient하지만 TLS / SSL 암호화 , ASCII 모드, 활성 모드 등과 같이 제공되지 않는 경우 FtpWebRequest. 쉬운 방법은 다음을 FileStream사용하여 FTP 스트림에 복사하는 것입니다 Stream.CopyTo.

FtpWebRequest request =
    (FtpWebRequest)WebRequest.Create("ftp://ftp.example.com/remote/path/file.zip");
request.Credentials = new NetworkCredential("username", "password");
request.Method = WebRequestMethods.Ftp.UploadFile;

using (Stream fileStream = File.OpenRead(@"C:\local\path\file.zip"))
using (Stream ftpStream = request.GetRequestStream())
{
    fileStream.CopyTo(ftpStream);
}

진행 모니터링

업로드 진행 상황을 모니터링해야하는 경우 콘텐츠를 청크별로 직접 복사해야합니다.

FtpWebRequest request =
    (FtpWebRequest)WebRequest.Create("ftp://ftp.example.com/remote/path/file.zip");
request.Credentials = new NetworkCredential("username", "password");
request.Method = WebRequestMethods.Ftp.UploadFile;

using (Stream fileStream = File.OpenRead(@"C:\local\path\file.zip"))
using (Stream ftpStream = request.GetRequestStream())
{
    byte[] buffer = new byte[10240];
    int read;
    while ((read = fileStream.Read(buffer, 0, buffer.Length)) > 0)
    {
        ftpStream.Write(buffer, 0, read);
        Console.WriteLine("Uploaded {0} bytes", fileStream.Position);
    }
}

GUI 진행률 (WinForms ProgressBar)은 C # 예제를 참조하십시오.
FtpWebRequest를 사용하여 업로드 진행률 표시 줄을 표시하는 방법


폴더 업로드

폴더에서 모든 파일을 업로드하려면 WebClient를 사용하여 FTP 서버에 파일 디렉토리 업로드를 참조하십시오.
.

재귀 업로드의 경우 C #에서 FTP 서버에 재귀 업로드를 참조
하세요.


답변

다음은 나를 위해 작동합니다.

public virtual void Send(string fileName, byte[] file)
{
    ByteArrayToFile(fileName, file);

    var request = (FtpWebRequest) WebRequest.Create(new Uri(ServerUrl + fileName));

    request.Method = WebRequestMethods.Ftp.UploadFile;
    request.UsePassive = false;
    request.Credentials = new NetworkCredential(UserName, Password);
    request.ContentLength = file.Length;

    var requestStream = request.GetRequestStream();
    requestStream.Write(file, 0, file.Length);
    requestStream.Close();

    var response = (FtpWebResponse) request.GetResponse();

    if (response != null)
        response.Close();
}

파일 이름 일 뿐이므로 코드에서 파일 매개 변수를 읽을 수 없습니다.

다음을 사용하십시오.

byte[] bytes = File.ReadAllBytes(dir + file);

Send메서드에 전달할 수 있도록 파일을 가져옵니다 .


답변

public static void UploadFileToFtp(string url, string filePath, string username, string password)
{
    var fileName = Path.GetFileName(filePath);
    var request = (FtpWebRequest)WebRequest.Create(url + fileName);

    request.Method = WebRequestMethods.Ftp.UploadFile;
    request.Credentials = new NetworkCredential(username, password);
    request.UsePassive = true;
    request.UseBinary = true;
    request.KeepAlive = false;

    using (var fileStream = File.OpenRead(filePath))
    {
        using (var requestStream = request.GetRequestStream())
        {
            fileStream.CopyTo(requestStream);
            requestStream.Close();
        }
    }

    var response = (FtpWebResponse)request.GetResponse();
    Console.WriteLine("Upload done: {0}", response.StatusDescription);
    response.Close();
}


답변

첫 번째 예에서는 다음으로 변경해야합니다.

requestStream.Flush();
requestStream.Close();

먼저 플러시하고 그 후 닫습니다.


답변

이것은 나를 위해 작동합니다.이 방법은 파일을 네트워크 내의 위치로 SFTP합니다. SSH.NET.2013.4.7 라이브러리를 사용하며 무료로 다운로드 할 수 있습니다.

    //Secure FTP
    public void SecureFTPUploadFile(string destinationHost,int port,string username,string password,string source,string destination)

    {
        ConnectionInfo ConnNfo = new ConnectionInfo(destinationHost, port, username, new PasswordAuthenticationMethod(username, password));

        var temp = destination.Split('/');
        string destinationFileName = temp[temp.Count() - 1];
        string parentDirectory = destination.Remove(destination.Length - (destinationFileName.Length + 1), destinationFileName.Length + 1);


        using (var sshclient = new SshClient(ConnNfo))
        {
            sshclient.Connect();
            using (var cmd = sshclient.CreateCommand("mkdir -p " + parentDirectory + " && chmod +rw " + parentDirectory))
            {
                cmd.Execute();
            }
            sshclient.Disconnect();
        }


        using (var sftp = new SftpClient(ConnNfo))
        {
            sftp.Connect();
            sftp.ChangeDirectory(parentDirectory);
            using (var uplfileStream = System.IO.File.OpenRead(source))
            {
                sftp.UploadFile(uplfileStream, destinationFileName, true);
            }
            sftp.Disconnect();
        }
    }