Tải tệp lên FTP bằng C #


112

Tôi thử tải tệp lên máy chủ FTP bằng C #. Tệp được tải lên nhưng không có byte.

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

18
Tại sao gần 2 năm sau, thông tin xác thực FTP gốc vẫn hoạt động?
FreeAsInBeer

1
có thể bản sao của tập tin tải về ftp
Frédéric

Bạn có thể thử những gì được đề cập trong câu hỏi liên quan đến @Frederic và nhận được trở lại ... Hơn thế nữa nó không được rõ ràng những gì api bạn đang sử dụng để tải lên ftp ...
deostroll

Câu trả lời:


272

Các câu trả lời hiện có là hợp lệ, nhưng tại sao phải phát minh lại bánh xe và bận tâm với các WebRequestloại cấp thấp hơn trong khi WebClientđã triển khai tải lên FTP một cách gọn gàng:

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

39
Chỉ một xu: bạn có thể thay thế chuỗi ma thuật "STOR" cho WebRequestMethods.Ftp.UploadFile
Nhấp vào Ok

Thật không may, dường như không có cách nào sử dụng WebClient để tạo một thư mục mới để tải tệp lên.
danludwig

1
PSA: webrequest không còn được khuyến nghị nữa, đây hiện là các lựa chọn thay thế chính thức
Pacharrin

Xin chào, path.zip trong phương thức UploadFile chỉ ra điều gì? Tôi có cần tên tệp để bao gồm sau tên máy chủ không? Tôi chỉ có một tệp txt để gửi, tôi nghĩ rằng tên tệp và đường dẫn đến tệp đó được đề cập trong localFile.
Skanda

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

Cách sử dụng

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

sử dụng cái này trong foreach của bạn

và bạn chỉ cần tạo thư mục một lần

để tạo một thư mục

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

3
Câu trả lời bỏ lỡ một cuộc gọi đến request.GetResponse(). Nếu không có nó, quá trình tải lên sẽ không hoạt động (chính xác) trên một số máy chủ. Xem Cách thực hiện: Tải tệp lên bằng FTP .
Martin Prikryl

Tôi muốn -1 vì âm thầm nuốt các ngoại lệ. Bạn có thể vui lòng xóa khối try-catch có hại đó không?
Heinzi

33

Cách dễ nhất

Cách đơn giản nhất để tải tệp lên máy chủ FTP bằng .NET framework là sử dụng WebClient.UploadFilephương pháp :

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

Tùy chọn nâng cao

Nếu bạn cần một quyền kiểm soát lớn hơn, điều WebClientđó không cung cấp (như mã hóa TLS / SSL , chế độ ASCII, chế độ hoạt động, v.v.), hãy sử dụng FtpWebRequest. Cách dễ dàng là chỉ cần sao chép một FileStreamluồng FTP bằng cách sử dụng 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);
}

Giám sát tiến độ

Nếu bạn cần theo dõi tiến trình tải lên, bạn phải tự sao chép nội dung theo từng đoạn:

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

Đối với tiến trình GUI (WinForms ProgressBar), hãy xem ví dụ C # tại:
Làm cách nào chúng tôi có thể hiển thị thanh tiến trình để tải lên với FtpWebRequest


Đang tải lên thư mục

Nếu bạn muốn tải lên tất cả các tệp từ một thư mục, hãy xem
Tải thư mục tệp lên máy chủ FTP bằng cách sử dụng WebClient .

Để tải lên đệ quy, hãy xem
Tải lên đệ quy lên máy chủ FTP trong C #


10

Những điều sau đây phù hợp với tôi:

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

Bạn không thể đọc gửi tham số tệp trong mã của mình vì nó chỉ là tên tệp.

Sử dụng như sau:

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

Để lấy tệp để bạn có thể chuyển nó vào Sendphương thức.


xin chào, tôi có một thư mục chứa các tập tin trong đó .. làm cách nào tôi có thể tải nó lên máy chủ FTP? Mã này tôi không biết chính xác nó hoạt động như thế nào?
webvision

trong vòng lặp foreach gọi phương thức này với đầu vào thích hợp.
nRk

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

tại sao bạn đặt KeepAlive = false? Bạn có chắc rằng yêu cầu requestStream.Close () là cần thiết? Bạn sử dụng requestStream bên trong bằng cách sử dụng nên tôi nghĩ nó sẽ tự đóng luồng.
Kate

2

Trong ví dụ đầu tiên, phải thay đổi chúng thành:

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

Xả đầu tiên và sau đó đóng lại.


1

Điều này phù hợp với tôi, phương pháp này sẽ chuyển tệp SFTP đến một vị trí trong mạng của bạn. Nó sử dụng thư viện SSH.NET.2013.4.7. Bạn chỉ cần tải xuống miễn phí.

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

Câu trả lời này có vẻ như là giải pháp duy nhất cho sftp của tôi. Đang chờ để kiểm tra nó.
Olorunfemi Ajibulu

1

ngày xuất bản: 26/6/2018

https://docs.microsoft.com/en-us/dotnet/framework/network-programming/how-to-upload-files-with-ftp

using System;
using System.IO;
using System.Net;
using System.Text;

namespace Examples.System.Net
{
    public class WebRequestGetExample
    {
    public static void Main ()
    {
        // Get the object used to communicate with the server.
        FtpWebRequest request = 
(FtpWebRequest)WebRequest.Create("ftp://www.contoso.com/test.htm");
        request.Method = WebRequestMethods.Ftp.UploadFile;

        // This example assumes the FTP site uses anonymous logon.
        request.Credentials = new NetworkCredential("anonymous", 
"janeDoe@contoso.com");

        // Copy the contents of the file to the request stream.
        byte[] fileContents;
        using (StreamReader sourceStream = new StreamReader("testfile.txt"))
        {
            fileContents = Encoding.UTF8.GetBytes(sourceStream.ReadToEnd());
        }

        request.ContentLength = fileContents.Length;

        using (Stream requestStream = request.GetRequestStream())
        {
            requestStream.Write(fileContents, 0, fileContents.Length);
        }

        using (FtpWebResponse response = (FtpWebResponse)request.GetResponse())
        {
            Console.WriteLine($"Upload File Complete, status 
{response.StatusDescription}");
        }
    }
}
}

0

Tôi đã quan sát thấy rằng -

  1. FtpwebRequest bị thiếu.
  2. Vì mục tiêu là FTP, vì vậy NetworkCredential bắt buộc phải có.

Tôi đã chuẩn bị một phương thức hoạt động như thế này, bạn có thể thay thế giá trị của biến ftpurl bằng tham số TargetDestinationPath. Tôi đã thử nghiệm phương pháp này trên ứng dụng 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();
        }

Hãy cho tôi biết trong trường hợp có bất kỳ sự cố nào hoặc đây là một liên kết khác có thể giúp bạn:

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.