上传文件到FTP

24

我想将一个服务器上的文件上传到另一个FTP服务器,以下是我的上传文件代码,但它会抛出一个错误:

远程服务器返回了一个错误:(550)文件不可用(例如,文件未找到,没有访问权限)。

这是我的代码:

string CompleteDPath = "ftp URL";
string UName = "UserName";
string PWD = "Password";
WebRequest reqObj = WebRequest.Create(CompleteDPath + FileName);
reqObj.Method = WebRequestMethods.Ftp.UploadFile;
reqObj.Credentials = new NetworkCredential(UName, PWD);
FileStream streamObj = System.IO.File.OpenRead(Server.MapPath(FileName));
byte[] buffer = new byte[streamObj.Length + 1];
streamObj.Read(buffer, 0, buffer.Length);
streamObj.Close();
streamObj = null;
reqObj.GetRequestStream().Write(buffer, 0, buffer.Length);
reqObj = null; 

请问我哪里做错了?


在这里重复了这里,并附有一个有趣的答案 - Frédéric
7个回答

39
请确保您的FTP路径如下所示。
string CompleteDPath = "ftp://www.example.com/wwwroot/videos/";

string FileName = "sample.mp4";

WebRequest reqObj = WebRequest.Create(CompleteDPath + FileName);

以下脚本适用于我将文件和视频通过FTP上传到另一个服务器的操作。

FtpWebRequest ftpClient = (FtpWebRequest)FtpWebRequest.Create(ftpurl + "" + username + "_" + filename);
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();
value = uploadResponse.StatusDescription;
uploadResponse.Close();

14

以下是上传文件到FTP服务器的示例代码

    string filename = Server.MapPath("file1.txt");
    string ftpServerIP = "ftp.demo.com/";
    string ftpUserName = "dummy";
    string ftpPassword = "dummy";

    FileInfo objFile = new FileInfo(filename);
    FtpWebRequest objFTPRequest;

    // Create FtpWebRequest object 
    objFTPRequest = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://" + ftpServerIP + "/" + objFile.Name));

    // Set Credintials
    objFTPRequest.Credentials = new NetworkCredential(ftpUserName, ftpPassword);

    // By default KeepAlive is true, where the control connection is 
    // not closed after a command is executed.
    objFTPRequest.KeepAlive = false;

    // Set the data transfer type.
    objFTPRequest.UseBinary = true;

    // Set content length
    objFTPRequest.ContentLength = objFile.Length;

    // Set request method
    objFTPRequest.Method = WebRequestMethods.Ftp.UploadFile;

    // Set buffer size
    int intBufferLength = 16 * 1024;
    byte[] objBuffer = new byte[intBufferLength];

    // Opens a file to read
    FileStream objFileStream = objFile.OpenRead();

    try
    {
        // Get Stream of the file
        Stream objStream = objFTPRequest.GetRequestStream();

        int len = 0;

        while ((len = objFileStream.Read(objBuffer, 0, intBufferLength)) != 0)
        {
            // Write file Content 
            objStream.Write(objBuffer, 0, len);

        }

        objStream.Close();
        objFileStream.Close();
    }
    catch (Exception ex)
    {
        throw ex;
    }

有没有什么好的想法可以安全地上传文件到FTP服务器?我的意思是在不暴露服务器密码的情况下完成上传。 - martynaspikunas
2
您可以从代码外部的某些源(例如配置文件或注册表)读取服务器密码。但是,当用户通过FTP登录到服务器时,用户ID和密码将以未加密的形式传递,因此任何具有线路访问权限的人都可以看到它。保护密码是无用的,因为使用FTP会暴露它。如果您需要安全性,则需要使用Secure FTP,这是完全不同的东西(需要第三方库和证书)。 - StarPilot
您可以从配置文件(如web.config或app.config)或注册表中获取密码。 - Jayesh Sorathia
它将适用于托管在服务器上的ASP.NET Web应用程序,并且文件将由HTML input type=file标签获取。 - Kalpesh Rajai

14

您还可以使用更高级别的WebClient类型来执行FTP操作,代码更加清晰简洁:

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

如何将它用于属于表单类的方法中?提前感谢。 - willy wonka

2
如果您仍然遇到问题,以下是帮助我解决所有问题的方法。尽管我可以在尝试上传文件的目录中完美地看到该文件,即:我正在覆盖一个文件,但我仍然遇到了相同的错误。
我的ftp url看起来像:
// ftp://www.mywebsite.com/testingdir/myData.xml
FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://www.mywebsite.com/testingdir/myData.xml"

所以,我的凭证使用我的测试员用户名和密码;

request.Credentials = new NetworkCredential ("tester", "testerpw");

我的“测试人员”FTP账户设置为“ftp://www.mywebsite.com/testingdir”,但是当我实际从FTP [例如从资源管理器] 连接时,我只需输入“ftp://www.mywebsite.com”,然后使用我的测试人员凭据登录,并自动发送到“testingdir”。

因此,为了使C#中的这个工作正常,我使用了URL- ftp://www.mywebsite.com/myData.xml 提供了我的测试人员凭据,一切都正常工作。


1
  1. Please make sure your URL that you pass to WebRequest.Create has this format:

     ftp://ftp.example.com/remote/path/file.zip
    
  2. There are easier ways to upload a file using .NET framework.

最简单的方法

使用.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提供更多的控制(例如TLS/SSL加密,ascii/text传输模式,传输恢复等),请使用FtpWebRequest。但是您可以通过使用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);
}

如果需要更多选项,包括进度监控和上传整个文件夹,请参见:
使用C#将文件上传到FTP


0

这里是解决方案!!!!!

将本地目录中的所有文件(例如:D:\Documents)上传到FTP URL(例如:ftp:\{ip地址}\{子目录名称})

public string UploadFile(string FileFromPath, string ToFTPURL, string SubDirectoryName, string FTPLoginID, string
FTPPassword)
    {
        try
        {
            string FtpUrl = string.Empty;
            FtpUrl = ToFTPURL + "/" + SubDirectoryName;    //Complete FTP Url path

            string[] files = Directory.GetFiles(FileFromPath, "*.*");    //To get each file name from FileFromPath

            foreach (string file in files)
            {
                FtpWebRequest request = (FtpWebRequest)FtpWebRequest.Create(FtpUrl + "/" + Path.GetFileName(file));
                request.Method = WebRequestMethods.Ftp.UploadFile;
                request.Credentials = new NetworkCredential(FTPLoginID, FTPPassword);
                request.UsePassive = true;
                request.UseBinary = true;
                request.KeepAlive = false;

                FileStream stream = File.OpenRead(FileFromPath + "\\" + Path.GetFileName(file));
                byte[] buffer = new byte[stream.Length];


                stream.Read(buffer, 0, buffer.Length);
                stream.Close();

                Stream reqStream = request.GetRequestStream();
                reqStream.Write(buffer, 0, buffer.Length);
                reqStream.Close();
            }
            return "Success";
        }
        catch(Exception ex)
        {
            return "ex";
        }

    }

-1
    public void UploadImageToftp()

        {

     string server = "ftp://111.61.28.128/Example/"; //server path
     string name = @"E:\Apache\htdocs\visa\image.png"; //image path
      string Imagename= Path.GetFileName(name);

    FtpWebRequest request = (FtpWebRequest)WebRequest.Create(new Uri(string.Format("{0}{1}", server, Imagename)));
    request.Method = WebRequestMethods.Ftp.UploadFile;
    request.Credentials = new NetworkCredential("username", "password");
    Stream ftpStream = request.GetRequestStream();
    FileStream fs = File.OpenRead(name);
    byte[] buffer = new byte[1024];
    int byteRead = 0;
    do
    {
        byteRead = fs.Read(buffer, 0, 1024);
        ftpStream.Write(buffer, 0, byteRead);
    }
    while (byteRead != 0);
    fs.Close();
    ftpStream.Close();
    MessageBox.Show("Image Upload successfully!!");
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接