因为网站有下载文件需要和网站分离,使用到了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 = ""; //GetAppConfig("password"); //ftp密码
  8. // 2M 可能不够
  9. private const int bufferSize = ;
  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'), );
  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 -;
  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 = ;
  113. var b = new byte[BufferLength];
  114. int i;
  115. while ((i = fs.Read(b, , BufferLength)) > )
  116. {
  117. stream.Write(b, , 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, , bufferSize);
  156.  
  157. try
  158. {
  159. while (bytesSent != )
  160. {
  161. ftpStream.Write(byteBuffer, , bytesSent);
  162. bytesSent = localFileStream.Read(byteBuffer, , 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. public static FtpWebRequest FtpRequest(string requstUrl,string method,bool closedResponse=false)
  183. {
  184. var reqFtp = (FtpWebRequest) WebRequest.Create(new Uri(requstUrl));
  185. //设置连接到FTP的帐号密码
  186. reqFtp.Credentials = new NetworkCredential(Username, Password);
  187. //设置请求完成后是否保持连接
  188. reqFtp.KeepAlive = false;
  189. //指定执行命令
  190. reqFtp.Method = method;
  191. //指定数据传输类型
  192. reqFtp.UseBinary = true;
  193.  
  194. if (closedResponse)
  195. {
  196. var resp=reqFtp.GetResponse();
  197. resp.Close();
  198. }
  199.  
  200. return reqFtp;
  201. }
  202.  
  203. /// <summary>
  204. /// 下载
  205. /// </summary>
  206. /// <param name="localFile">目的位置</param>
  207. /// <param name="remoteFile">服务器相对位置</param>
  208. /// <returns></returns>
  209. public static bool Download(string localFile,string remoteFile)
  210. {
  211. bool check = true;
  212. try
  213. {
  214. var outputStream = new FileStream(localFile, FileMode.Create);
  215. var ftpRequest = FtpRequest(Path + remoteFile, WebRequestMethods.Ftp.DownloadFile);
  216.  
  217. var response = (FtpWebResponse)ftpRequest.GetResponse();
  218. Stream ftpStream = response.GetResponseStream();
  219. long cl = response.ContentLength;
  220. int bufferSize = ;
  221. int readCount;
  222. var buffer = new byte[bufferSize];
  223.  
  224. readCount = ftpStream.Read(buffer, , bufferSize);
  225. while (readCount > )
  226. {
  227. outputStream.Write(buffer, , readCount);
  228. readCount = ftpStream.Read(buffer, , bufferSize);
  229. }
  230. ftpStream.Close();
  231. outputStream.Close();
  232. response.Close();
  233. }
  234. catch (Exception err)
  235. {
  236. check = false;
  237. }
  238. return check;
  239. }
  240.  
  241. public static Stream Download(string remoteFile)
  242. {
  243. var ftpRequest = FtpRequest(Path + remoteFile, WebRequestMethods.Ftp.DownloadFile);
  244. var response = (FtpWebResponse)ftpRequest.GetResponse();
  245. Stream ftpStream = response.GetResponseStream();
  246. return ftpStream;
  247. }
  248.  
  249. /// <summary>
  250. /// 删除文件
  251. /// </summary>
  252. /// <param name="fileName">服务器下的相对路径 包括文件名</param>
  253. public static void DeleteFileName(string fileName)
  254. {
  255. try
  256. {
  257. FtpRequest(Path + fileName, WebRequestMethods.Ftp.DeleteFile,true);
  258. }
  259. catch (Exception ex)
  260. {
  261. Console.WriteLine("删除文件出错:" + ex.Message);
  262. }
  263. }
  264.  
  265. /// <summary>
  266. /// 新建目录 上一级必须先存在
  267. /// </summary>
  268. /// <param name="dirName">服务器下的相对路径</param>
  269. public static void MakeDir(string dirName)
  270. {
  271. try
  272. {
  273. FtpRequest(Path + dirName, WebRequestMethods.Ftp.MakeDirectory, true);
  274. }
  275. catch (Exception ex)
  276. {
  277. Console.WriteLine("创建目录出错:" + ex.Message);
  278. }
  279. }
  280.  
  281. /// <summary>
  282. /// 删除目录 上一级必须先存在
  283. /// </summary>
  284. /// <param name="dirName">服务器下的相对路径</param>
  285. public static void DelDir(string dirName)
  286. {
  287. try
  288. {
  289. FtpRequest(Path + dirName, WebRequestMethods.Ftp.RemoveDirectory,true);
  290. }
  291. catch (Exception ex)
  292. {
  293. Console.WriteLine("删除目录出错:" + ex.Message);
  294. }
  295. }
  296.  
  297. /// <summary>
  298. /// 从ftp服务器上获得文件夹列表
  299. /// </summary>
  300. /// <param name="requedstPath">服务器下的相对路径</param>
  301. /// <returns></returns>
  302. public static List<string> GetDirctory(string requedstPath)
  303. {
  304. var strs = new List<string>();
  305. try
  306. {
  307. var reqFtp = FtpRequest(Path + requedstPath, WebRequestMethods.Ftp.ListDirectoryDetails);
  308. WebResponse response = reqFtp.GetResponse();
  309. var reader = new StreamReader(response.GetResponseStream()); //中文文件名
  310.  
  311. string line = reader.ReadLine();
  312. while (line != null)
  313. {
  314. if (line.Contains("<DIR>"))
  315. {
  316. string msg = line.Substring(line.LastIndexOf("<DIR>") + ).Trim();
  317. strs.Add(msg);
  318. }
  319. line = reader.ReadLine();
  320. }
  321. reader.Close();
  322. response.Close();
  323. return strs;
  324. }
  325. catch (Exception ex)
  326. {
  327. Console.WriteLine("获取目录出错:" + ex.Message);
  328. }
  329. return strs;
  330. }
  331.  
  332. /// <summary>
  333. /// 从ftp服务器上获得文件列表
  334. /// </summary>
  335. /// <param name="requedstPath">服务器下的相对路径</param>
  336. /// <returns></returns>
  337. public static List<string> GetFile(string requedstPath)
  338. {
  339. var strs = new List<string>();
  340. try
  341. {
  342. var reqFtp = FtpRequest(Path + requedstPath, WebRequestMethods.Ftp.ListDirectoryDetails);
  343. WebResponse response = reqFtp.GetResponse();
  344. var reader = new StreamReader(response.GetResponseStream()); //中文文件名
  345.  
  346. string line = reader.ReadLine();
  347. while (line != null)
  348. {
  349. if (!line.Contains("<DIR>"))
  350. {
  351. string msg = line.Substring().Trim();
  352. strs.Add(msg);
  353. }
  354. line = reader.ReadLine();
  355. }
  356. reader.Close();
  357. response.Close();
  358. return strs;
  359. }
  360. catch (Exception ex)
  361. {
  362. Console.WriteLine("获取文件出错:" + ex.Message);
  363. }
  364. return strs;
  365. }
  366. }

主要是通过创建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, , bufferSize);
  10.  
  11. try
  12. {
  13. while (bytesSent != )
  14. {
  15. ftpStream.Write(byteBuffer, , bytesSent);
  16. bytesSent = localFileStream.Read(byteBuffer, , 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. }

调用:

  1. [HttpPost]
  2. public JsonResult UploadFile(HttpPostedFileBase fileData)
  3. {
  4. if (fileData != null)
  5. {
  6. string fileName = Path.GetFileName(fileData.FileName);// 原始文件名称
  7. string saveName = Encrypt.GenerateOrderNumber() +"_"+fileName;
  8. FtpHelper.UpLoad(fileData.InputStream, "DIAView" + "/" + saveName);
  9. return Json(new { Success = true, FileName = fileName, SaveName = saveName}, JsonRequestBehavior.AllowGet);
  10. }
  11. return Json(new { Success = false, Message = "请选择要上传的文件!" }, JsonRequestBehavior.AllowGet);
  12. }

Ftp还可以设置不同用户有不同的目录,是以为记。

FTP文件管理的更多相关文章

  1. C# winfrom 模拟ftp文件管理

    从网上找到的非常好用的模拟ftp管理代码,整理了一下,希望对需要的人有帮助 using System; using System.Collections.Generic; using System.T ...

  2. FTP服务器上删除文件夹失败

    很多人都知道:要删除FTP服务器上的文件夹时,必须确保文件夹下面没有其他文件,否则会删除失败! 可是,有些服务器考虑到安全等因素,通常会隐藏以点开始的文件名,例如“.test.txt”.于是,有的坏人 ...

  3. Java语言实现简单FTP软件------>上传下载管理模块的实现(十一)

    1.上传本地文件或文件夹到远程FTP服务器端的功能. 当用户在本地文件列表中选择想要上传的文件后,点击上传按钮,将本机上指定的文件上传到FTP服务器当前展现的目录,下图为上传子模块流程图 选择好要上传 ...

  4. FTP文传协议的应用

    我开发的项目中一直用到都是AFNetworking上传图片的方法,最近老大说要用FTP上传,网上的资料很少,毕竟这种上传方式现在用的不多了,于是花了一天时间学习了FTP文件传输协议.下面是我的个人理解 ...

  5. Web 项目可能会用到的20款优秀的开源工具

    开源的应用程序和它们的源代码可以免费获得,因为版权是属于任何进行过修改或者提交代码的人.大多数提供开源软件的公司都可以建立行业标准,因此可以获得有利的竞争优势. 很多的开源应用程序和工具都有很强的替代 ...

  6. 令人惊叹的Visual Studio Code插件

    vscode是一款开源且优秀的编辑器,接下来让我吐血推荐一下我工作使用过的令人惊叹的Visual Studio Code插件. 代码编辑插件 vscode-color-highlight ------ ...

  7. PHP基础教程 10款人气暴涨的PHP开源工具

    若想创建动态而又新颖的Web应用程序,PHP便是理想的选择.不用说,在Web开发世界里,PHP是最流行的语言之一.一些非常好用的PHP开源工具着实拯救了不少开发任务繁重的PHP开发 人员,减轻他们的开 ...

  8. 10款人气暴涨的PHP开源工具

    若想创建动态而又新颖的Web应用程序,PHP便是理想的选择.不用说,在Web开发世界里,PHP是最流行的语言之一.一些非常好用的PHP开源工具着实拯救了不少开发任务繁重的PHP开发人员,减轻他们的开发 ...

  9. Web文件管理:elFinder.Net(支持FTP)

    elFinder 是一个基于 Web 的文件管理器,灵感来自 Mac OS X 的 Finder 程序. elFinder.Net是.Net版本的一个Demo,使用ASP.NET MVC 4集成,可以 ...

随机推荐

  1. Linux服务器上安装织梦CMS

    安装篇 第一步:配置防火墙(默认情况下,端口80和3306是拒绝访问的,在防火墙上进行配置): vi /etc/sysconfig/iptables(在"COMMIT"的上一行加上 ...

  2. DOS:将某文件夹下面的所有某一类型文件名输出

    C:\Users\lv>cd /d C:\Siemens\Teamcenter11\lib C:\Siemens\Teamcenter11\lib>dir /B *.lib >lis ...

  3. Linux添加/删除用户和用户组

    声明:现大部分文章为寻找问题时在网上相互转载,在此博客中做个记录,方便自己也方便有类似问题的朋友,故原出处已不好查到,如有侵权,请发邮件表明文章和原出处地址,我一定在文章中注明.谢谢. 本文总结了Li ...

  4. 默认构造方法并非总是public的

    以前印象中一直有一个概念,说"如果没有提供构造方法,java将自动添加一个空的public的构造方法".现在看来,有2个问题,一,默认构造方法未必是public的,二,默认构造方法 ...

  5. 陨石坑之webapi使用filter

    首先为什么说这是一个坑,是因为我们在webapi中使用filter的时候也许会先百度一下,好吧,挖坑的来了,我看了好几篇文章写的是使用System.Web.Mvc.Filters.ActionFilt ...

  6. SAP项目管理模块培训教材

    SAP项目管理模块培训教材(PLM210.PLM220.PLM230)分享: http://sap.npbok.com/

  7. css3动画之图片旋转

    直接上代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UT ...

  8. SQL Server 分区表

    分区表可以提高查询效率 但是如果是分区表的话,表数据就会按照你指定的规则分放到不同的文件里,把一个大的数据文件拆分为多个小文件,还可以把这些小文件放在不同的磁盘下由多个cpu进行处理.这样文件的大小随 ...

  9. 『TCP/IP详解——卷一:协议』读书笔记——14

    2013-08-25 11:32:06 第5章 RARP:逆地址解析协议 5.1 引言 具有本地磁盘的系统引导时,一般是从磁盘上的配置文件中读取IP地址.但是无盘机,如X终端或无盘工作站,则需要采用其 ...

  10. iOS开发之AppIcon及LaunchScreen设置

    一.AppIcon设置 具体设置步骤如下图: 二.LaunchScreen设置与停留时间设置 具体设置步骤如下图: 通过程序可以增加背景的停留时间: