.net 명령 - C#을 사용하여 FTP에 파일 업로드




다중 사용할 (8)

기존 답변은 유효하지만 WebClient 가 FTP 업로드를 이미 구현하는 동안 낮은 수준의 WebRequest 유형을 WebRequest 하는 이유는 무엇입니까?

using (WebClient client = new WebClient())
{
    client.Credentials = new NetworkCredential(ftpUsername, ftpPassword);
    client.UploadFile("ftp://ftpserver.com/target.zip", "STOR", localFilePath);
}

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 !");
    }
}

나는 그것을 관찰했다 -

  1. FtpwebRequest가 없습니다.
  2. 대상은 FTP이므로 NetworkCredential이 필요합니다.

이렇게 작동하는 메소드를 준비했습니다. 변수 ftpurl의 값을 TargetDestinationPath 매개 변수로 바꿀 수 있습니다. winforms 응용 프로그램에서이 메서드를 테스트했다 :

private void UploadProfileImage(string TargetFileName, string TargetDestinationPath, string FiletoUpload)
        {
            //Get the Image Destination path
            string imageName = TargetFileName; //you can comment this
            string imgPath = TargetDestinationPath; 

            string ftpurl = "ftp://downloads.abc.com/downloads.abc.com/MobileApps/SystemImages/ProfileImages/" + imgPath;
            string ftpusername = krayknot_DAL.clsGlobal.FTPUsername;
            string ftppassword = krayknot_DAL.clsGlobal.FTPPassword;
            string fileurl = FiletoUpload;

            FtpWebRequest ftpClient = (FtpWebRequest)FtpWebRequest.Create(ftpurl);
            ftpClient.Credentials = new System.Net.NetworkCredential(ftpusername, ftppassword);
            ftpClient.Method = System.Net.WebRequestMethods.Ftp.UploadFile;
            ftpClient.UseBinary = true;
            ftpClient.KeepAlive = true;
            System.IO.FileInfo fi = new System.IO.FileInfo(fileurl);
            ftpClient.ContentLength = fi.Length;
            byte[] buffer = new byte[4097];
            int bytes = 0;
            int total_bytes = (int)fi.Length;
            System.IO.FileStream fs = fi.OpenRead();
            System.IO.Stream rs = ftpClient.GetRequestStream();
            while (total_bytes > 0)
            {
                bytes = fs.Read(buffer, 0, buffer.Length);
                rs.Write(buffer, 0, bytes);
                total_bytes = total_bytes - bytes;
            }
            //fs.Flush();
            fs.Close();
            rs.Close();
            FtpWebResponse uploadResponse = (FtpWebResponse)ftpClient.GetResponse();
            string value = uploadResponse.StatusDescription;
            uploadResponse.Close();
        }

문제가있을 경우 알려 주시거나 도움이 될만한 링크가 하나 더 있습니다.

https://msdn.microsoft.com/en-us/library/ms229715(v=vs.110).aspx


이것은 나를 위해 작동,이 방법은 파일을 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();
        }
    }

public void UploadFtpFile(string folderName, string fileName)
{

FtpWebRequest request;
try
{
    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();
    }
}
catch (Exception ex)
{

}
}

사용하는 방법

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 Framework를 사용하여 FTP 서버에 파일을 업로드하는 가장 간단한 방법은 WebClient.UploadFile 메서드를 사용 하는 것입니다 .

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 암호화 등과 같이 제공하지 않으며 FtpWebRequest 사용하십시오. 쉬운 방법은 Stream.CopyTo 사용하여 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 # example at :
FtpWebRequest를 사용하여 업로드 진행률 표시 줄을 어떻게 표시 할 수 있습니까?

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


첫 번째 예에서는 다음과 같이 변경해야합니다.

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

먼저 닫고 그 후에 닫는다.


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();
}

그것을 여기에서 발견 : http://www.snippetsource.net/Snippet/127/upload-a-file-with-ftp-in-c


그것은 당신이 원하는 바이트에 따라 다릅니다.

이것은 타일러가 적절하게 said 것처럼 "문자열은 순수한 데이터가 아니며 information 도 가지고 있기 때문 입니다." 이 경우 정보는 문자열을 만들 때 가정 한 인코딩입니다.

문자열에 저장된 이진 데이터 (텍스트가 아닌)가 있다고 가정합니다.

이것은 OP 자신의 질문에 대한 OP의 설명을 기반으로하며 유스 케이스에서 OP의 힌트를 이해한다면 올바른 질문입니다.

위에서 언급 한 인코딩 때문에 바이너리 데이터를 문자열에 저장하는 것은 잘못된 방법 일 것입니다! 어떤 프로그램이나 라이브러리가 바이너리 데이터를 저장 했더라도 string( byte[]더 적절한 배열 대신 ) 전투가 시작되기 전에 이미 잃어 버렸습니다. 그들이 바이트를 REST 요청 / 응답 또는 문자열을 전송 해야하는 것으로 보내는 경우 Base64 가 올바른 접근 방법입니다.

알 수없는 인코딩을 가진 텍스트 문자열이있는 경우

다른 사람들은이 잘못된 질문에 잘못 대답했습니다.

문자열이있는 것처럼 보이면 그냥 인코딩 (UTF로 시작하는 인코딩을 선호)을 선택하고 해당 System.Text.Encoding.???.GetBytes()함수를 사용하고 인코딩을 선택한 바이트를 누구에게 건 사람에게 말하십시오.





c# .net file-upload ftp