首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 2.0 FTP 用戶端實作(二):上傳與屬性設定

     編輯:關於C語言

FtpWebRequest 關鍵屬性詳細說明

屬性用途建議值
CredentialsFTP 認證憑證new NetworkCredential(user, pass)
KeepAlive控制連線是否持久false(單次操作)、true(批量操作)
UseBinary傳輸模式:二進位/ASCIItrue(二進位,通用安全)
UsePassive被動/主動模式true(被動,穿透防火牆)
ContentLength上傳檔案大小(通知伺服器)fileInfo.Length
MethodFTP 指令WebRequestMethods.Ftp.UploadFile 等
EnableSsl啟用 FTPS 加密true(若伺服器支援)

二進位 vs ASCII 模式

  • Binary:所有 8 位元皆為資料,適用圖片、執行檔、壓縮檔、.docx、.pdf 等
  • ASCII:第 8 位元作錯誤控制,僅適用純文字檔(.txt、.csv、.xml、.html)
  • 建議:預設使用 Binary,文字檔用 Binary 也無妨,反向則會損壞二進位檔

主動 vs 被動模式

主動模式 (PORT):伺服器從 Port 20 主動連線客戶端高位埠。客戶端防火牆常封鎖 → 失敗。
被動模式 (PASV):客戶端主動連線伺服器高位埠。伺服器通常開放範圍 → 成功率高。
結論:預設 UsePassive = true。

上傳檔案完整實作

public void Upload(string localFilePath)
{
    FileInfo fileInfo = new FileInfo(localFilePath);
    string uri = $"ftp://{FtpServerIP}/{fileInfo.Name}";

    var request = (FtpWebRequest)WebRequest.Create(uri);
    request.Credentials = new NetworkCredential(FtpUserId, FtpPassword);
    request.KeepAlive = false;
    request.Method = WebRequestMethods.Ftp.UploadFile;
    request.UseBinary = true;
    request.ContentLength = fileInfo.Length;

    const int BufferSize = 2048;
    byte[] buffer = new byte[BufferSize];

    using (var fileStream = fileInfo.OpenRead())
    using (var requestStream = request.GetRequestStream())
    {
        int bytesRead;
        while ((bytesRead = fileStream.Read(buffer, 0, BufferSize)) > 0)
        {
            requestStream.Write(buffer, 0, bytesRead);
        }
    }

    // 取得回應確認完成
    using (var response = (FtpWebResponse)request.GetResponse())
    {
        Console.WriteLine($"上傳完成,狀態:{response.StatusDescription}");
    }
}

進階:支援續傳 (APPE 指令)

request.Method = WebRequestMethods.Ftp.AppendFile;
// 需搭配 RestartOffset (需 .NET 4.5+ 或自行發送 REST 指令)

錯誤處理模式

try
{
    // FTP 操作
}
catch (WebException ex) when (ex.Response is FtpWebResponse ftpResp)
{
    Console.WriteLine($"FTP 錯誤:{ftpResp.StatusCode} - {ftpResp.StatusDescription}");
}
catch (WebException ex)
{
    Console.WriteLine($"網路錯誤:{ex.Message}");
}
catch (Exception ex)
{
    Console.WriteLine($"未預期錯誤:{ex.Message}");
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved