সি # ব্যবহার করে এফটিপিতে ফাইল আপলোড করুন


112

আমি সি # দিয়ে এফটিপি-সার্ভারে একটি ফাইল আপলোড করার চেষ্টা করব। ফাইলটি আপলোড করা হয়েছে তবে শূন্য বাইট সহ।

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
প্রায় ২ বছর পরে কেন মূল এফটিপি শংসাপত্রগুলি এখনও কাজ করে?
ফ্রিএএসআইনবিয়ার



উত্তর:


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
মাত্র এক শতাংশ: আপনি ওয়েবআরকুয়েস্টমেথডস এর জন্য "STOR" ম্যাজিক স্ট্রিং প্রতিস্থাপন করতে পারেন tএফটিপি.আপলোড ফাইল
ঠিক

দুর্ভাগ্যক্রমে, কোনও ফাইল আপলোড করার জন্য একটি নতুন ডিরেক্টরি তৈরি করার জন্য ওয়েবক্লিয়েন্ট ব্যবহার করার কোনও উপায় বলে মনে হচ্ছে না।
ডানলডুইগ

1
পিএসএ: ওয়েবেরউইস্টের আর সুপারিশ করা হয় না, এটি এখন সরকারী বিকল্প
পাচারিন

হ্যালো আপলোডফাইলে পদ্ধতিতে প্যাথ.জিপ কী নির্দেশ করে? হোস্টের নাম অন্তর্ভুক্ত করার জন্য আমার কি কোনও ফাইলের নাম দরকার? আমার কাছে কেবল পাঠানোর জন্য একটি টেক্সট ফাইল রয়েছে, আমি ভেবেছিলাম ফাইলটির নাম এবং সেই ফাইলটির পাথ স্থানীয় ফাইলে উল্লেখ করা হয়েছে।
স্ক্যান্ড

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()। এটি না করে আপলোড কিছু সার্ভারে (সঠিকভাবে) কাজ করবে না। কীভাবে তা দেখুন : এফটিপি সহ ফাইলগুলি আপলোড করুন
মার্টিন প্রিক্রিল

আমি ব্যতিক্রম নিঃশব্দে গ্রাস করার জন্য -1 প্রলোভিত। আপনি কি দয়া করে সেই ক্ষতিকারক চেষ্টা-ধরা-ব্লকটি সরিয়ে ফেলতে পারেন?
হেইনজি

33

সহজ রাস্তা

সবচেয়ে তুচ্ছ পথ ব্যবহার .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তবে এটি অফার করে না (যেমন টিএলএস / এসএসএল এনক্রিপশন , এএসসিআইআই মোড, অ্যাক্টিভ মোড ইত্যাদি), ব্যবহার করুন 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);
    } 
}

জিইউআই অগ্রগতির জন্য (উইনফর্মস ProgressBar), সি # উদাহরণটি এখানে দেখুন:
আমরা কীভাবে FtpWebRequest দিয়ে আপলোডের জন্য অগ্রগতি বারটি প্রদর্শন করতে পারি?


ফোল্ডার আপলোড হচ্ছে

আপনি যদি কোনও ফোল্ডার থেকে সমস্ত ফাইল আপলোড করতে চান তবে ওয়েবক্লিয়েন্ট ব্যবহার করে এফটিপি সার্ভারে ফাইলগুলির আপলোড ডিরেক্টরি দেখুন

পুনরাবৃত্তির জন্য আপলোডের জন্য, সি # তে এফটিপি সার্ভারে পুনরাবৃত্ত আপলোড দেখুন see


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পদ্ধতিতে পাস করতে পারেন ।


হ্যালো, আমার এতে ফাইলগুলির একটি ফোল্ডার আছে .. আমি কীভাবে এটি কেবল একটি এফটিপি সার্ভারে আপলোড করতে পারি? এই কোডটি আমি কীভাবে কাজ করে ঠিক জানি না?
ওয়েবভিশন

ফরচ লুপে উপযুক্ত ইনপুট সহ এই পদ্ধতিটিকে কল করুন।
এনআরকে

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

আপনি কিপএলাইভ = মিথ্যা কেন সেট করেন? আপনি কি নিশ্চিত যে স্ট্রিম.ক্লোস () বন্ধ করে দেওয়ার অনুরোধ করা এটি দেশীয়? আপনি অনুরোধের স্ট্রিমটি ব্যবহার করে ভিতরে ব্যবহার করুন যাতে আমার মনে হয় এটি নিজের দ্বারা প্রবাহ বন্ধ হবে।
কেট

2

প্রথম উদাহরণে এগুলিতে অবশ্যই পরিবর্তন করতে হবে:

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

প্রথম ফ্লাশ এবং তার পরে।


1

এটি আমার পক্ষে কাজ করে, এই পদ্ধতিটি আপনার নেটওয়ার্কের মধ্যে কোনও স্থানে একটি ফাইল এসএফটিপি করবে। এটি এসএসএইচ.নেট.২..4..2013. library গ্রন্থাগার ব্যবহার করে neএকটি এটি বিনামূল্যে ডাউনলোড করতে পারে।

    //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. যেহেতু লক্ষ্যটি এফটিপি, তাই নেটওয়ার্কক্রেডেনসিয়াল প্রয়োজনীয়।

আমি এমন একটি পদ্ধতি প্রস্তুত করেছি যা এই জাতীয়ভাবে কাজ করে, আপনি টার্গেটডেস্টিনেশনপথের সাথে প্যারামিটারের সাহায্যে চলক ftpurl এর মান প্রতিস্থাপন করতে পারেন। উইনফরম অ্যাপ্লিকেশনটিতে আমি এই পদ্ধতিটি পরীক্ষা করেছিলাম:

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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.