【问题标题】:Upload file on FTP通过 FTP 上传文件
【发布时间】:2012-04-26 10:59:36
【问题描述】:

我想将文件从一台服务器上传到另一台 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; 

你能告诉我哪里出错了吗?

【问题讨论】:

  • FileName 的值是多少?您要获取的文件的地址是什么?你确定CompleteDPath + FileName 能给你想要的吗?
  • @Mark Byers :FileName 是文件存在于一台服务器上并且需要传输到另一台服务器的位置。 CompleteDPath = 这是需要传输文件的另一台服务器的路径。
  • 不......他在问你传递给路径和文件名的值是什么。您尝试通过的路径是什么?
  • 您是否手动测试过您的用户名和密码是否具有写入权限?可能值得注销 CompleteDPath + FileName 以确保它是一个体面的 url - CompleteDPath 是否以 / 结尾
  • @GregHNZ :是的,用户名和密码正确,因为我尝试连接 Filezila

标签: c# asp.net .net ftp ftpwebrequest


【解决方案1】:

请确保您的 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();

【讨论】:

    【解决方案2】:

    这是在 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 服务器吗?我的意思是不要在代码中留下暴露的服务器密码。
    • 您可以从代码之外的某个来源(例如配置文件或注册表)读取您的服务器密码。但是,当 FTP 登录服务器时,用户 ID 和密码将通过未加密的方式传递,因此任何有权访问该线路的人都可以看到它。使保护密码无用,因为它是通过使用 FTP 暴露的。如果您需要安全,则需要使用 Secure FTP,这是完全不同的事情(需要第三方库和证书)。
    • 您可以从 web.config 或 app.config 等配置文件或注册表中获取密码。
    • 它适用于托管在服务器上的ASP.NET web application,文件将由HTML input type=file标签获取
    【解决方案3】:

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

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

    【讨论】:

    • 如何在表单类拥有的方法中使用它?提前致谢
    【解决方案4】:

    如果您仍然遇到问题,这就是让我克服这一切的原因。 尽管我可以完美地看到我尝试上传的目录中的文件,但我遇到了同样的错误 - 即:我正在覆盖一个文件。

    我的 ftp 网址看起来像:

    // 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”并使用我的测试人员凭据登录并自动发送到“测试目录”。

    所以,为了在 C# 中完成这项工作,我最终使用了 url - ftp://www.mywebsite.com/myData.xml 提供我的测试人员帐户凭据,一切正常。

    【讨论】:

      【解决方案5】:
      1. 请确保您传递给WebRequest.Create 的网址具有以下格式:

         ftp://ftp.example.com/remote/path/file.zip
        
      2. 使用 .NET 框架上传文件有更简单的方法。

      最简单的方法

      使用 .NET 框架将文件上传到 FTP 服务器最简单的方法是使用WebClient.UploadFile method

      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 encryption、ascii/文本传输模式、传输恢复等),请像您一样使用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);
      }
      

      有关更多选项,包括进度监控和上传整个文件夹,请参阅:
      Upload file to FTP using C#

      【讨论】:

        【解决方案6】:

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

        将本地目录(例如:D:\Documents)中的所有文件上传到 FTP url(例如:ftp:\{ip address}\{sub dir name})

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

        【讨论】:

          【解决方案7】:
              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!!");
          }
          

          【讨论】:

            猜你喜欢
            • 2013-03-24
            • 2018-01-05
            • 2012-02-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-05-19
            相关资源
            最近更新 更多