1 using System;
2 using System.Collections.Generic;
3 using System.IO;
4 using System.Net;
5 using Microsoft.AspNetCore.Http;
6
7 namespace Util
8 {
9 public class FTPHelper
10 {
11 #region FTP服务器身份验证信息
12
13 private static string ftpServer = GlobalSwitch.ServerAddress;
14 private static string username = GlobalSwitch.LoginName;
15 private static string password = GlobalSwitch.LoginPWD;
16
17 #endregion
18
19 #region 上传文件
20
21 /// <summary>
22 /// 上传文件
23 /// </summary>
24 /// <param name="file"></param>
25 /// <param name="dir"></param>
26 public static void FileUpLoad(IFormFile file, string dir)
27 {
28 try
29 {
30 string url = Path.Combine(ftpServer, dir);
31 string fileName = file.FileName;
32 Uri uri = new Uri(Path.Combine(url, fileName));
33 using (Stream fs = file.OpenReadStream())
34 {
35 long length = fs.Length;
36 FtpWebRequest reqFTP = (FtpWebRequest)FtpWebRequest.Create(uri);
37 reqFTP.Credentials = new NetworkCredential(username, password);
38 reqFTP.KeepAlive = false;
39 reqFTP.Method = WebRequestMethods.Ftp.UploadFile;
40 reqFTP.UseBinary = true;
41
42 using (Stream stream = reqFTP.GetRequestStream())
43 {
44 int BufferLength = (Int32)length;
45 byte[] b = new byte[BufferLength];
46 int i;
47 while ((i = fs.Read(b, 0, BufferLength)) > 0)
48 {
49 stream.Write(b, 0, i);
50 }
51 Console.WriteLine("上传文件成功");
52 }
53 }
54 }
55 catch (Exception ex)
56 {
57 throw ex;
58 }
59 }
60
61 /// <summary>
62 /// 文件上传
63 /// </summary>
64 /// <param name="filePath">原路径(绝对路径)包括文件名</param>
65 /// <param name="uploadPath">目标文件夹</param>
66 public static void FileUpLoad(string filePath, string uploadPath)
67 {
68 try
69 {
70 string url = Path.Combine(ftpServer,uploadPath);
71 try
72 {
73 try
74 {
75 FileInfo fileInfo = new FileInfo(filePath);
76 using (FileStream fs = fileInfo.OpenRead())
77 {
78 long length = fs.Length;
79 FtpWebRequest reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(url + fileInfo.Name));
80 reqFTP.Credentials = new NetworkCredential(username, password);
81 reqFTP.KeepAlive = false;
82 reqFTP.Method = WebRequestMethods.Ftp.UploadFile;
83 reqFTP.UseBinary = true;
84 using (Stream stream = reqFTP.GetRequestStream())
85 {
86 int BufferLength = (Int32)length;
87 byte[] b = new byte[BufferLength];
88 int i;
89 while ((i = fs.Read(b, 0, BufferLength)) > 0)
90 {
91 stream.Write(b, 0, i);
92 }
93 Console.WriteLine("上传文件成功");
94 }
95 }
96 }
97 catch (Exception ex)
98 {
99 Console.WriteLine("上传文件失败错误为" + ex.Message);
100 }
101 finally
102 {
103
104 }
105 }
106 catch (Exception ex)
107 {
108 Console.WriteLine("上传文件失败错误为" + ex.Message);
109 }
110 finally
111 {
112
113 }
114 }
115 catch (Exception ex)
116 {
117 Console.WriteLine("上传文件失败错误为" + ex.Message);
118 }
119 }
120
121 #endregion
122
123 #region 下载文件
124
125 /// <summary>
126 /// 下载文件
127 /// </summary>
128 /// <param name="dir"></param>
129 /// <param name="fileName"></param>
130 /// <param name="localFile"></param>
131 public static void GetFile(string dir, string fileName, string localFile)
132 {
133 string filedownloadPath = Path.Combine(ftpServer, dir);
134 Uri uri = new Uri(Path.Combine(filedownloadPath, fileName));
135 try
136 {
137 FtpWebRequest request = (FtpWebRequest)WebRequest.Create(uri);
138 request.Credentials = new NetworkCredential(username, password);
139 request.UseBinary = true;
140 request.UsePassive = true;
141 request.KeepAlive = false;
142 request.Method = WebRequestMethods.Ftp.DownloadFile;
143
144 FtpWebResponse response = (FtpWebResponse)request.GetResponse();
145 using (Stream stream = response.GetResponseStream())
146 {
147 int bufferSize = 65536;
148 using (FileStream localFileStream = new FileStream(localFile, FileMode.OpenOrCreate))
149 {
150 byte[] byteBuffer = new byte[bufferSize];
151 int bytesRead = stream.Read(byteBuffer, 0, bufferSize);
152
153 try
154 {
155 while (bytesRead > 0)
156 {
157 localFileStream.Write(byteBuffer, 0, bytesRead);
158 bytesRead = stream.Read(byteBuffer, 0, bufferSize);
159 }
160 }
161 catch (Exception ex)
162 {
163 throw ex;
164 }
165 }
166 }
167 response.Close();
168 request = null;
169 }
170 catch (Exception ex)
171 {
172 throw ex;
173 }
174 }
175
176 /// <summary>
177 /// 获取文件 byte[]
178 /// </summary>
179 /// <param name="dir"></param>
180 /// <param name="fileName"></param>
181 /// <returns></returns>
182 public static byte[] GetFileBytes(string dir, string fileName)
183 {
184 int bufferSize = 65536;
185 byte[] byteBuffer = new byte[bufferSize];
186 string filedownloadPath = Path.Combine(ftpServer, dir);
187 Uri uri = new Uri(Path.Combine(filedownloadPath, fileName));
188 try
189 {
190 FtpWebRequest request = (FtpWebRequest)WebRequest.Create(uri);
191 request.Credentials = new NetworkCredential(username, password);
192 request.UseBinary = true;
193 request.UsePassive = true;
194 request.KeepAlive = false;
195 request.Method = WebRequestMethods.Ftp.DownloadFile;
196
197 FtpWebResponse response = (FtpWebResponse)request.GetResponse();
198 using (Stream stream = response.GetResponseStream())
199 {
200 stream.Read(byteBuffer, 0, bufferSize);
201 }
202 }
203 catch (Exception ex)
204 {
205 throw ex;
206 }
207 return byteBuffer;
208 }
209
210 #endregion
211
212 #region 删除文件
213
214 /// <summary>
215 /// 删除文件
216 /// </summary>
217 /// <param name="fileName">服务器下的相对路径 包括文件名</param>
218 public static void DeleteFileName(string fileName)
219 {
220 try
221 {
222 string ftpIP = ftpServer.Substring(6);
223 FileInfo fileInf = new FileInfo(Path.Combine(ftpIP, fileName));
224 string uri = Path.Combine(ftpServer, fileName);
225 FtpWebRequest reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri));
226 reqFTP.UseBinary = true;
227 reqFTP.Credentials = new NetworkCredential(username, password);
228 reqFTP.KeepAlive = false;
229 reqFTP.Method = WebRequestMethods.Ftp.DeleteFile;
230 FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
231 response.Close();
232 }
233 catch (Exception ex)
234 {
235 Console.WriteLine("删除文件出错:" + ex.Message);
236 }
237 }
238
239 #endregion
240
241 #region 获取文件列表
242
243 /// <summary>
244 /// 从ftp服务器上获得文件列表
245 /// </summary>
246 /// <param name="RequedstPath">服务器下的相对路径</param>
247 /// <returns></returns>
248 public static List<string> GetFile(string RequedstPath)
249 {
250 List<string> strs = new List<string>();
251 try
252 {
253 string uri = Path.Combine(ftpServer, RequedstPath);
254 FtpWebRequest reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri));
255 reqFTP.Credentials = new NetworkCredential(username, password);
256 reqFTP.KeepAlive = false;
257 reqFTP.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
258 WebResponse response = reqFTP.GetResponse();
259 StreamReader reader = new StreamReader(response.GetResponseStream());
260
261 string line = reader.ReadLine();
262 while (line != null)
263 {
264 if (!line.Contains("<DIR>"))
265 {
266 string msg = line.Substring(39).Trim();
267 strs.Add(msg);
268 }
269 line = reader.ReadLine();
270 }
271 reader.Close();
272 response.Close();
273 return strs;
274 }
275 catch (Exception ex)
276 {
277 Console.WriteLine("获取文件出错:" + ex.Message);
278 }
279 return strs;
280 }
281
282 #endregion
283
284 #region 创建文件夹
285
286 /// <summary>
287 /// 新建目录 上一级必须先存在
288 /// </summary>
289 /// <param name="dirName">服务器下的相对路径</param>
290 public static void MakeDir(string dirName)
291 {
292 try
293 {
294 string uri = Path.Combine(ftpServer,dirName);
295 FtpWebRequest reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri));
296 reqFTP.UseBinary = true;
297 reqFTP.KeepAlive = false;
298 reqFTP.Credentials = new NetworkCredential(username, password);
299 reqFTP.Method = WebRequestMethods.Ftp.MakeDirectory;
300 FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
301 response.Close();
302 }
303 catch (Exception ex)
304 {
305 Console.WriteLine("创建目录出错:" + ex.Message);
306 }
307 }
308
309 #endregion
310
311 #region 删除文件夹
312
313 /// <summary>
314 /// 删除目录 上一级必须先存在
315 /// </summary>
316 /// <param name="dirName">服务器下的相对路径</param>
317 public static void DelDir(string dirName)
318 {
319 try
320 {
321 string uri =Path.Combine(ftpServer,dirName);
322 FtpWebRequest reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri));
323 reqFTP.Credentials = new NetworkCredential(username, password);
324 reqFTP.KeepAlive = false;
325 reqFTP.Method = WebRequestMethods.Ftp.RemoveDirectory;
326 FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
327 response.Close();
328 }
329 catch (Exception ex)
330 {
331 Console.WriteLine("删除目录出错:" + ex.Message);
332 }
333 }
334
335 #endregion
336
337 #region 获取文件夹列表
338
339 /// <summary>
340 /// 从ftp服务器上获得文件夹列表
341 /// </summary>
342 /// <param name="RequedstPath">服务器下的相对路径</param>
343 /// <returns></returns>
344 public static List<string> GetDirctory(string RequedstPath)
345 {
346 List<string> strs = new List<string>();
347 try
348 {
349 string uri =Path.Combine(ftpServer,RequedstPath);
350 FtpWebRequest reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri));
351 reqFTP.Credentials = new NetworkCredential(username, password);
352 reqFTP.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
353 reqFTP.KeepAlive = false;
354 WebResponse response = reqFTP.GetResponse();
355 StreamReader reader = new StreamReader(response.GetResponseStream());
356
357 string line = reader.ReadLine();
358 while (line != null)
359 {
360 if (line.Contains("<DIR>"))
361 {
362 string msg = line.Substring(line.LastIndexOf("<DIR>") + 5).Trim();
363 strs.Add(msg);
364 }
365 line = reader.ReadLine();
366 }
367 reader.Close();
368 response.Close();
369 return strs;
370 }
371 catch (Exception ex)
372 {
373 Console.WriteLine("获取目录出错:" + ex.Message);
374 }
375 return strs;
376 }
377
378 #endregion
379 }
380 }