FTP文件管理
来源:http://www.cnblogs.com/stoneniqiu/p/5064942.html
作者:博客园的Stoneniqiu
因为网站有下载文件需要和网站分离,使用到了FTP管理文件,这里做一个简单的整理。
1.安装FTP
和安装iis一样。全部勾选。
设置站点名称和路径。
设置ip。
身份授权选择所有用户,可以读写。
完成之后 IIS就会出现:
2.添加FTP用户
计算机-->管理-->本地用户和组。 添加用户,描述为FTP。
这里要设置用户的密码方式,去掉“用户下次登录时必须更改密码”的选项。
不然会登录不成功。报530错误。
3.测试登录
ftp ip 就可以访问。显示230 user logged in 表示登录成功。
4.上传下载
FtpHelper:

1 public static class FtpHelper 2 { 3 //基本设置 4 private const string Path = @"ftp://192.168.253.4:21/"; //目标路径 5 private const string Ftpip = "192.168.253.4"; // GetAppConfig("obj"); //ftp IP地址 6 private const string Username = "stone"; //GetAppConfig("username"); //ftp用户名 7 private const string Password = "111111"; //GetAppConfig("password"); //ftp密码 8 // 2M 可能不够 9 private const int bufferSize = 2048; 10 11 /// <summary> 12 /// 获取自定义配置的值 13 /// </summary> 14 /// <param name="strKey">键值</param> 15 /// <returns>键值对应的值</returns> 16 public static string GetAppConfig(string strKey) 17 { 18 foreach (string key in ConfigurationManager.AppSettings) 19 { 20 if (key == strKey) 21 { 22 return ConfigurationManager.AppSettings[strKey]; 23 } 24 } 25 return null; 26 } 27 28 //获取ftp上面的文件和文件夹 29 public static string[] GetFileList(string dir) 30 { 31 var result = new StringBuilder(); 32 try 33 { 34 var ftpRequest = FtpRequest(Path, WebRequestMethods.Ftp.ListDirectory); 35 36 WebResponse response = ftpRequest.GetResponse(); 37 var reader = new StreamReader(response.GetResponseStream()); 38 39 string line = reader.ReadLine(); 40 while (line != null) 41 { 42 result.Append(line); 43 result.Append("\n"); 44 Console.WriteLine(line); 45 line = reader.ReadLine(); 46 } 47 // to remove the trailing '\n' 48 result.Remove(result.ToString().LastIndexOf('\n'), 1); 49 reader.Close(); 50 response.Close(); 51 return result.ToString().Split('\n'); 52 } 53 catch (Exception ex) 54 { 55 Console.WriteLine("获取ftp上面的文件和文件夹:" + ex.Message); 56 return new[] {""}; 57 } 58 } 59 60 /// <summary> 61 /// 获取文件大小 62 /// </summary> 63 /// <param name="file">ip服务器下的相对路径</param> 64 /// <returns>文件大小</returns> 65 public static int GetFileSize(string file) 66 { 67 var result = new StringBuilder(); 68 FtpWebRequest request; 69 try 70 { 71 request = (FtpWebRequest) WebRequest.Create(new Uri(Path + file)); 72 request.UseBinary = true; 73 request.Credentials = new NetworkCredential(Username, Password); //设置用户名和密码 74 request.Method = WebRequestMethods.Ftp.GetFileSize; 75 76 var dataLength = (int) request.GetResponse().ContentLength; 77 78 return dataLength; 79 } 80 catch (Exception ex) 81 { 82 Console.WriteLine("获取文件大小出错:" + ex.Message); 83 return -1; 84 } 85 } 86 87 /// <summary> 88 /// 文件上传 89 /// </summary> 90 /// <param name="localFile">原路径(绝对路径)包括文件名</param> 91 /// <param name="remoteFile">目标文件夹:服务器下的相对路径 不填为根目录</param> 92 public static bool UpLoad(string localFile, string remoteFile = "") 93 { 94 try 95 { 96 string url = Path; 97 if (remoteFile != "") 98 url += remoteFile + "/"; 99 try 100 { 101 //待上传的文件 (全路径) 102 try 103 { 104 var fileInfo = new FileInfo(localFile); 105 using (FileStream fs = fileInfo.OpenRead()) 106 { 107 long length = fs.Length; 108 FtpWebRequest reqFtp = FtpRequest(url + fileInfo.Name,WebRequestMethods.Ftp.UploadFile); 109 using (Stream stream = reqFtp.GetRequestStream()) 110 { 111 //设置缓冲大小 112 int BufferLength = 5120; 113 var b = new byte[BufferLength]; 114 int i; 115 while ((i = fs.Read(b, 0, BufferLength)) > 0) 116 { 117 stream.Write(b, 0, i); 118 } 119 Console.WriteLine("上传文件成功"); 120 return true; 121 } 122 } 123 } 124 catch (Exception ex) 125 { 126 Console.WriteLine("上传文件失败错误为" + ex.Message); 127 } 128 finally 129 { 130 } 131 } 132 catch (Exception ex) 133 { 134 Console.WriteLine("上传文件失败错误为" + ex.Message); 135 } 136 finally 137 { 138 } 139 } 140 catch (Exception ex) 141 { 142 Console.WriteLine("上传文件失败错误为" + ex.Message); 143 } 144 return false; 145 } 146 147 public static bool UpLoad(Stream localFileStream, string remoteFile) 148 { 149 bool result = true; 150 try 151 { 152 var ftpRequest = FtpRequest(Path + remoteFile, WebRequestMethods.Ftp.UploadFile); 153 var ftpStream = ftpRequest.GetRequestStream(); 154 var byteBuffer = new byte[bufferSize]; 155 int bytesSent = localFileStream.Read(byteBuffer, 0, bufferSize); 156 157 try 158 { 159 while (bytesSent != 0) 160 { 161 ftpStream.Write(byteBuffer, 0, bytesSent); 162 bytesSent = localFileStream.Read(byteBuffer, 0, bufferSize); 163 } 164 } 165 catch (Exception ex) 166 { 167 Console.WriteLine(ex.ToString()); 168 result = false; 169 } 170 171 localFileStream.Close(); 172 ftpStream.Close(); 173 } 174 catch (Exception ex) 175 { 176 Console.WriteLine(ex.ToString()); 177 result = false; 178 } 179 return result; 180 } 181 182 183 public static FtpWebRequest FtpRequest(string requstUrl,string method,bool closedResponse=false) 184 { 185 var reqFtp = (FtpWebRequest) WebRequest.Create(new Uri(requstUrl)); 186 //设置连接到FTP的帐号密码 187 reqFtp.Credentials = new NetworkCredential(Username, Password); 188 //设置请求完成后是否保持连接 189 reqFtp.KeepAlive = false; 190 //指定执行命令 191 reqFtp.Method = method; 192 //指定数据传输类型 193 reqFtp.UseBinary = true; 194 195 if (closedResponse) 196 { 197 var resp=reqFtp.GetResponse(); 198 resp.Close(); 199 } 200 201 return reqFtp; 202 } 203 204 /// <summary> 205 /// 下载 206 /// </summary> 207 /// <param name="localFile">目的位置</param> 208 /// <param name="remoteFile">服务器相对位置</param> 209 /// <returns></returns> 210 public static bool Download(string localFile,string remoteFile) 211 { 212 bool check = true; 213 try 214 { 215 var outputStream = new FileStream(localFile, FileMode.Create); 216 var ftpRequest = FtpRequest(Path + remoteFile, WebRequestMethods.Ftp.DownloadFile); 217 218 var response = (FtpWebResponse)ftpRequest.GetResponse(); 219 Stream ftpStream = response.GetResponseStream(); 220 long cl = response.ContentLength; 221 int bufferSize = 2048; 222 int readCount; 223 var buffer = new byte[bufferSize]; 224 225 readCount = ftpStream.Read(buffer, 0, bufferSize); 226 while (readCount > 0) 227 { 228 outputStream.Write(buffer, 0, readCount); 229 readCount = ftpStream.Read(buffer, 0, bufferSize); 230 } 231 ftpStream.Close(); 232 outputStream.Close(); 233 response.Close(); 234 } 235 catch (Exception err) 236 { 237 check = false; 238 } 239 return check; 240 } 241 242 public static Stream Download(string remoteFile) 243 { 244 var ftpRequest = FtpRequest(Path + remoteFile, WebRequestMethods.Ftp.DownloadFile); 245 var response = (FtpWebResponse)ftpRequest.GetResponse(); 246 Stream ftpStream = response.GetResponseStream(); 247 return ftpStream; 248 } 249 250 /// <summary> 251 /// 删除文件 252 /// </summary> 253 /// <param name="fileName">服务器下的相对路径 包括文件名</param> 254 public static void DeleteFileName(string fileName) 255 { 256 try 257 { 258 FtpRequest(Path + fileName, WebRequestMethods.Ftp.DeleteFile,true); 259 } 260 catch (Exception ex) 261 { 262 Console.WriteLine("删除文件出错:" + ex.Message); 263 } 264 } 265 266 /// <summary> 267 /// 新建目录 上一级必须先存在 268 /// </summary> 269 /// <param name="dirName">服务器下的相对路径</param> 270 public static void MakeDir(string dirName) 271 { 272 try 273 { 274 FtpRequest(Path + dirName, WebRequestMethods.Ftp.MakeDirectory, true); 275 } 276 catch (Exception ex) 277 { 278 Console.WriteLine("创建目录出错:" + ex.Message); 279 } 280 } 281 282 /// <summary> 283 /// 删除目录 上一级必须先存在 284 /// </summary> 285 /// <param name="dirName">服务器下的相对路径</param> 286 public static void DelDir(string dirName) 287 { 288 try 289 { 290 FtpRequest(Path + dirName, WebRequestMethods.Ftp.RemoveDirectory,true); 291 } 292 catch (Exception ex) 293 { 294 Console.WriteLine("删除目录出错:" + ex.Message); 295 } 296 } 297 298 /// <summary> 299 /// 从ftp服务器上获得文件夹列表 300 /// </summary> 301 /// <param name="requedstPath">服务器下的相对路径</param> 302 /// <returns></returns> 303 public static List<string> GetDirctory(string requedstPath) 304 { 305 var strs = new List<string>(); 306 try 307 { 308 var reqFtp = FtpRequest(Path + requedstPath, WebRequestMethods.Ftp.ListDirectoryDetails); 309 WebResponse response = reqFtp.GetResponse(); 310 var reader = new StreamReader(response.GetResponseStream()); //中文文件名 311 312 string line = reader.ReadLine(); 313 while (line != null) 314 { 315 if (line.Contains("<DIR>")) 316 { 317 string msg = line.Substring(line.LastIndexOf("<DIR>") + 5).Trim(); 318 strs.Add(msg); 319 } 320 line = reader.ReadLine(); 321 } 322 reader.Close(); 323 response.Close(); 324 return strs; 325 } 326 catch (Exception ex) 327 { 328 Console.WriteLine("获取目录出错:" + ex.Message); 329 } 330 return strs; 331 } 332 333 /// <summary> 334 /// 从ftp服务器上获得文件列表 335 /// </summary> 336 /// <param name="requedstPath">服务器下的相对路径</param> 337 /// <returns></returns> 338 public static List<string> GetFile(string requedstPath) 339 { 340 var strs = new List<string>(); 341 try 342 { 343 var reqFtp = FtpRequest(Path + requedstPath, WebRequestMethods.Ftp.ListDirectoryDetails); 344 WebResponse response = reqFtp.GetResponse(); 345 var reader = new StreamReader(response.GetResponseStream()); //中文文件名 346 347 string line = reader.ReadLine(); 348 while (line != null) 349 { 350 if (!line.Contains("<DIR>")) 351 { 352 string msg = line.Substring(39).Trim(); 353 strs.Add(msg); 354 } 355 line = reader.ReadLine(); 356 } 357 reader.Close(); 358 response.Close(); 359 return strs; 360 } 361 catch (Exception ex) 362 { 363 Console.WriteLine("获取文件出错:" + ex.Message); 364 } 365 return strs; 366 } 367 }
主要是通过创建FtpRequest来处理Ftp相关请求。

1 public static FtpWebRequest FtpRequest(string requstUrl,string method,bool closedResponse=false) 2 { 3 var reqFtp = (FtpWebRequest) WebRequest.Create(new Uri(requstUrl)); 4 //设置连接到FTP的帐号密码 5 reqFtp.Credentials = new NetworkCredential(Username, Password); 6 //设置请求完成后是否保持连接 7 reqFtp.KeepAlive = false; 8 //指定执行命令 9 reqFtp.Method = method; 10 //指定数据传输类型 11 reqFtp.UseBinary = true; 12 if (closedResponse) 13 { 14 var resp=reqFtp.GetResponse(); 15 resp.Close(); 16 } 17 return reqFtp; 18 }
因为在MVC网站中使用的文件流的方式。
下载:

1 public static Stream Download(string remoteFile) 2 { 3 var ftpRequest = FtpRequest(Path + remoteFile, WebRequestMethods.Ftp.DownloadFile); 4 var response = (FtpWebResponse)ftpRequest.GetResponse(); 5 Stream ftpStream = response.GetResponseStream(); 6 return ftpStream; 7 }
调用:

1 public ActionResult DownloadFileFromFtp() 2 { 3 var filepath = "DIAView//simple.png"; 4 var stream = FtpHelper.Download(filepath); 5 return File(stream, FileHelper.GetContentType(".png"),"test.png"); 6 }
上传:

1 public static bool UpLoad(Stream localFileStream, string remoteFile) 2 { 3 bool result = true; 4 try 5 { 6 var ftpRequest = FtpRequest(Path + remoteFile, WebRequestMethods.Ftp.UploadFile); 7 var ftpStream = ftpRequest.GetRequestStream(); 8 var byteBuffer = new byte[bufferSize]; 9 int bytesSent = localFileStream.Read(byteBuffer, 0, bufferSize); 10 11 try 12 { 13 while (bytesSent != 0) 14 { 15 ftpStream.Write(byteBuffer, 0, bytesSent); 16 bytesSent = localFileStream.Read(byteBuffer, 0, bufferSize); 17 } 18 } 19 catch (Exception ex) 20 { 21 Console.WriteLine(ex.ToString()); 22 result = false; 23 } 24 25 localFileStream.Close(); 26 ftpStream.Close(); 27 } 28 catch (Exception ex) 29 { 30 Console.WriteLine(ex.ToString()); 31 result = false; 32 } 33 return result; 34 }
调用:
public JsonResult UploadFile(HttpPostedFileBase fileData) { if (fileData != null) { string fileName = Path.GetFileName(fileData.FileName);// 原始文件名称 string saveName = Encrypt.GenerateOrderNumber() +"_"+fileName; FtpHelper.UpLoad(fileData.InputStream, "DIAView" + "/" + saveName); return Json(new { Success = true, FileName = fileName, SaveName = saveName}, JsonRequestBehavior.AllowGet); } return Json(new { Success = false, Message = "请选择要上传的文件!" }, JsonRequestBehavior.AllowGet); }
Ftp还可以设置不同用户有不同的目录,是以为记。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App