2012-04-14 157 views
20

我想上傳文件從一臺服務器到另一臺FTP服務器,以下是我的代碼上傳文件,但它是拋出一個錯誤:{「遠程服務器返回錯誤:(550)文件不可用例如,未找到文件,沒有訪問權限)「}在FTP上傳文件

這是我的代碼:

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; 

能否請你告訴我,我要去的地方錯了嗎?

+0

什麼是'FileName'的價值?你正試圖獲取的文件的地址是什麼?你確定'CompleteDPath + FileName'給你你想要的嗎? – 2012-04-14 06:53:00

+0

@Mark Byers:FileName是文件在一臺服務器上存在的位置,需要傳送到另一臺服務器。完整的通路=這是需要傳輸文件的另一臺服務器的路徑。 – 2012-04-14 06:57:43

+0

不......他問你傳遞給路徑和文件名的值是多少。你想通過什麼路徑? – Jack 2012-04-14 07:01:17

回答

37

請確保您的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(); 
+0

如何在文本中寫入值?不顯示:/ – 2018-02-06 04:52:24

13

下面是示例代碼上傳文件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; 
    } 
+0

任何想法如何安全地上傳文件到FTP服務器?我的意思是不要在代碼中留下暴露的服務器密碼。 – martynaspikunas 2014-01-23 03:07:17

+2

您可以從代碼之外的某個源(例如配置文件或註冊表)讀取服務器密碼。但是,用戶標識和密碼將在登錄到服務器時由FTP以未加密方式傳遞,以便任何有權訪問該線路的人都可以看到它。由於使用FTP公開了保護密碼,所以無用。如果您需要安全保護,則需要使用安全FTP,這是完全不同的事情(需要第三方庫和證書)。 – StarPilot 2014-07-01 16:43:52

+0

您可以從配置文件(如web.config或app.config)或註冊表中獲取密碼。 – 2014-07-02 08:35:44

2

上。在你仍然有問題,這裏是讓我過去,這一切情況。 儘管我可以完美地看到我想要上傳的目錄中的文件,例如:我正在覆蓋文件,但我仍然收到相同的錯誤。

我的FTP URL看起來像:

// ftp://www.mywebsite.com/testingdir/myData.xml 
FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://www.mywebsite.com/testingdir/myData.xml" 

所以,我的憑據,請使用我的測試車的用戶名和PW;

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 提供我的測試者帳戶憑據,一切正常。

12

您也可以使用更高級別的WebClient型做FTP的東西用更清潔代碼:

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

迄今爲止閱讀的最佳和最簡單的解決方案!謝謝 !! – Curtis 2016-12-21 22:22:10

+0

如何將它用於表單類擁有的方法?提前致謝 – 2017-08-11 16:11:52

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