C # का उपयोग करके FTP पर फ़ाइल अपलोड करें


112

मैं C # के साथ एक एफ़टीपी-सर्वर पर फ़ाइल अपलोड करने की कोशिश करता हूं। फ़ाइल अपलोड है लेकिन शून्य बाइट्स के साथ।

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
क्यों लगभग 2 साल बाद मूल एफ़टीपी क्रेडेंशियल अभी भी काम करते हैं?
FreeAsInBeer 19


आप की कोशिश कर सकते क्या सवाल @Frederic से जुड़ा हुआ में बताया गया है और वापस पाने ... morever यह स्पष्ट नहीं है कि आप एफ़टीपी अपलोड करने के लिए क्या एपीआई का उपयोग कर रहे हैं ...
deostroll

जवाबों:


272

मौजूदा उत्तर मान्य हैं, लेकिन पहिया का फिर से आविष्कार क्यों करें और निचले स्तर के WebRequestप्रकारों से परेशान करें जबकि WebClientपहले से ही एफ़टीपी को बड़े करीने से लागू करते हुए :

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

39
बस एक प्रतिशत: आप WebRequestMethods.Ftp.UploadFile के लिए जादुई स्ट्रिंग "STOR" को बदल सकते हैं
ठीक है क्लिक करें

दुर्भाग्य से, फ़ाइल को अपलोड करने के लिए नई निर्देशिका बनाने के लिए WebClient का उपयोग करने का एक तरीका प्रतीत नहीं होता है।
danludwig

1
PSA: webrequest की अब सिफारिश नहीं की गई है, यह अब आधिकारिक विकल्प हैं
Pacharrin

नमस्ते, UploadFile विधि में path.zip क्या दर्शाता है? क्या मुझे होस्ट नाम के बाद शामिल करने के लिए फ़ाइल नाम की आवश्यकता है? मेरे पास भेजने के लिए बस एक txt फ़ाइल है, मैंने सोचा कि फ़ाइल का नाम और उस फ़ाइल का पथ स्थानीय फ़ाइल में उल्लिखित है।
स्कंद

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

कैसे इस्तेमाल करे

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

इसे अपने फोरचेक में उपयोग करें

और आपको केवल एक बार फ़ोल्डर बनाने की आवश्यकता है

एक फ़ोल्डर बनाने के लिए

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
जवाब में एक कॉल याद आती है request.GetResponse()। इसके बिना, अपलोड कुछ सर्वरों पर (अधिकारपूर्वक) काम नहीं करेगा। कैसे देखें : FTP के साथ फाइल अपलोड करें
मार्टिन प्रिक्रील

मुझे चुपचाप अपवादों को निगलने के लिए -1 का लालच दिया जाता है। क्या आप कृपया उस हानिकारक ट्राई-कैच-ब्लॉक को हटा सकते हैं?
हिनजी १18 ’

33

सबसे आसान उपाय

सबसे छोटी तरीका का उपयोग कर .NET फ़्रेमवर्क उपयोग कर रहा है एक 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तो यह पेशकश नहीं करता है (जैसे टीएलएस / एसएसएल एन्क्रिप्शन , एएससीआईआई मोड, सक्रिय मोड, आदि), का उपयोग करें FtpWebRequest। आसान तरीका सिर्फ FileStreamएक एफ़टीपी स्ट्रीम का उपयोग करके कॉपी करना है 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 # उदाहरण देखें:
हम FtpWRequest के साथ अपलोड के लिए प्रगति बार कैसे दिखा सकते हैं


फोल्डर अपलोड करना

यदि आप किसी फ़ोल्डर से सभी फ़ाइलों को अपलोड करना चाहते हैं, तो
WebClient का उपयोग करके FTP सर्वर पर फ़ाइलों की निर्देशिका अपलोड करें देखें ।

पुनरावर्ती अपलोड के लिए, C # में FTP सर्वर पर पुनरावर्ती अपलोड देखें


10

निम्नलिखित मेरे लिए काम करता है:

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विधि से पास कर सकें ।


हैलो, मेरे पास इसमें फ़ाइलों के साथ एक फ़ोल्डर है .. मैं इसे केवल एफ़टीपी सर्वर पर कैसे अपलोड कर सकता हूं? यह कोड मुझे नहीं पता कि यह कैसे काम करता है?
वेबविजन

इनचार्ज लूप इस विधि को उपयुक्त इनपुट के साथ कहते हैं।
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();
}

आप KeepAlive = false क्यों सेट करते हैं? क्या आप सुनिश्चित हैं कि यह अनुरोध करने के लिए nesesary है। Close ()? आप requestStream का उपयोग करके अंदर का उपयोग करते हैं इसलिए मुझे लगता है कि यह अपने आप स्ट्रीम को बंद कर देगा।
केट

2

पहले उदाहरण में इन्हें बदलना होगा:

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

पहले फ्लश और उसके बाद बंद।


1

यह मेरे लिए काम करता है, यह विधि आपके नेटवर्क के भीतर एक स्थान के लिए एक फाइल को 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();
        }
    }

यह उत्तर मेरे sftp के लिए एकमात्र समाधान की तरह लगता है। इसका परीक्षण करने की प्रतीक्षा है।
ओलरुनफेमी अजिबुलु

1

प्रकाशित तिथि: 06/26/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

मैंने देखा है कि -

  1. FtpwebRequest गायब है।
  2. लक्ष्य के रूप में एफ़टीपी है, इसलिए 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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.