FTP文件管理

简介: 来源:http://www.cnblogs.com/stoneniqiu/p/5064942.html 作者:博客园的Stoneniqiu   因为网站有下载文件需要和网站分离,使用到了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     }
View Code

主要是通过创建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         }
View Code

因为在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         }
View Code

调用:

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         }
View Code

上传:

 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         }
View Code

调用:

        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还可以设置不同用户有不同的目录,是以为记。

 

相关文章
|
5天前
|
安全 算法 网络协议
【Linux】文件服务FTP(File Transfer Protocol)
【Linux】文件服务FTP(File Transfer Protocol)
55 0
|
5天前
|
开发框架 Java 数据处理
多sheet页导出 + FTP上传文件实战
多sheet页导出 + FTP上传文件实战
|
5月前
|
网络协议 安全 Linux
小白带你学习文件共享服务器FTP和SAMBA的学习(二十二)
小白带你学习文件共享服务器FTP和SAMBA的学习(二十二)
93 0
文件复制到ftp服务器时发生错误,请检查是否有权限将文件放到该服务器上
文件复制到ftp服务器时发生错误,请检查是否有权限将文件放到该服务器上
4867 0
|
5天前
|
存储 Unix Linux
LabVIEW与实时目标之间的FTP文件
LabVIEW与实时目标之间的FTP文件
|
5天前
|
监控 安全 测试技术
使用pyftpdlib组件实现FTP文件共享
使用pyftpdlib组件实现FTP文件共享
37 0
|
5天前
|
Java
java上传、下载、预览、删除ftp服务器上的文件
java上传、下载、预览、删除ftp服务器上的文件
|
9月前
|
Java
Java——通过Java代码从ftp服务器下载文件
Java——通过Java代码从ftp服务器下载文件
|
5天前
|
存储 数据处理
Dataphin集成任务支持自定义FTP标记完成文件内容(V3.14)
在文件传输的场景中,标记完成文件(有时也被称为标档文件)作为一种重要的确认机制被广泛应用。这一机制通过创建特定的“传输完成标识文件”,用于明确指示数据文件已成功完成全量传输,并达到可以进行下一步业务处理的状态,从而有效防止了基于不完整数据流的错误操作。
|
9月前
|
Unix Linux 测试技术
FTP命令不同系统之间传输文件
FTP命令不同系统之间传输文件