转载

FTP文件管理

因为网站有下载文件需要和网站分离,使用到了FTP管理文件,这里做一个简单的整理。

1.安装FTP

和安装iis一样。全部勾选。

FTP文件管理

设置站点名称和路径。

FTP文件管理

设置ip。

FTP文件管理

身份授权选择所有用户,可以读写。

FTP文件管理

完成之后 IIS就会出现:

FTP文件管理

2.添加FTP用户

计算机-->管理-->本地用户和组。 添加用户,描述为FTP。

FTP文件管理

这里要设置用户的密码方式,去掉“用户下次登录时必须更改密码”的选项。

FTP文件管理

不然会登录不成功。报530错误。

3.测试登录

ftp ip 就可以访问。显示230 user logged in 表示登录成功。

FTP文件管理

4.上传下载

FtpHelper:

   public static class FtpHelper     {         //基本设置         private const string Path = @"ftp://192.168.253.4:21/"; //目标路径         private const string Ftpip = "192.168.253.4"; // GetAppConfig("obj");    //ftp IP地址         private const string Username = "stone"; //GetAppConfig("username");   //ftp用户名         private const string Password = "111111"; //GetAppConfig("password");   //ftp密码        // 2M 可能不够         private const int bufferSize = 2048;          /// <summary>         /// 获取自定义配置的值         /// </summary>         /// <param name="strKey">键值</param>         /// <returns>键值对应的值</returns>         public static string GetAppConfig(string strKey)         {             foreach (string key in ConfigurationManager.AppSettings)             {                 if (key == strKey)                 {                     return ConfigurationManager.AppSettings[strKey];                 }             }             return null;         }          //获取ftp上面的文件和文件夹         public static string[] GetFileList(string dir)         {             var result = new StringBuilder();             try             {                 var ftpRequest = FtpRequest(Path, WebRequestMethods.Ftp.ListDirectory);                  WebResponse response = ftpRequest.GetResponse();                 var reader = new StreamReader(response.GetResponseStream());                  string line = reader.ReadLine();                 while (line != null)                 {                     result.Append(line);                     result.Append("/n");                     Console.WriteLine(line);                     line = reader.ReadLine();                 }                 // to remove the trailing '/n'                 result.Remove(result.ToString().LastIndexOf('/n'), 1);                 reader.Close();                 response.Close();                 return result.ToString().Split('/n');             }             catch (Exception ex)             {                 Console.WriteLine("获取ftp上面的文件和文件夹:" + ex.Message);                 return new[] {""};             }         }          /// <summary>         ///     获取文件大小         /// </summary>         /// <param name="file">ip服务器下的相对路径</param>         /// <returns>文件大小</returns>         public static int GetFileSize(string file)         {             var result = new StringBuilder();             FtpWebRequest request;             try             {                 request = (FtpWebRequest) WebRequest.Create(new Uri(Path + file));                 request.UseBinary = true;                 request.Credentials = new NetworkCredential(Username, Password); //设置用户名和密码                 request.Method = WebRequestMethods.Ftp.GetFileSize;                  var dataLength = (int) request.GetResponse().ContentLength;                  return dataLength;             }             catch (Exception ex)             {                 Console.WriteLine("获取文件大小出错:" + ex.Message);                 return -1;             }         }          /// <summary>         ///     文件上传         /// </summary>         /// <param name="localFile">原路径(绝对路径)包括文件名</param>         /// <param name="remoteFile">目标文件夹:服务器下的相对路径 不填为根目录</param>         public static bool UpLoad(string localFile, string remoteFile = "")         {             try             {                 string url = Path;                 if (remoteFile != "")                     url += remoteFile + "/";                 try                 {                     //待上传的文件 (全路径)                     try                     {                         var fileInfo = new FileInfo(localFile);                         using (FileStream fs = fileInfo.OpenRead())                         {                             long length = fs.Length;                             FtpWebRequest reqFtp = FtpRequest(url + fileInfo.Name,WebRequestMethods.Ftp.UploadFile);                             using (Stream stream = reqFtp.GetRequestStream())                             {                                 //设置缓冲大小                                 int BufferLength = 5120;                                 var b = new byte[BufferLength];                                 int i;                                 while ((i = fs.Read(b, 0, BufferLength)) > 0)                                 {                                     stream.Write(b, 0, i);                                 }                                 Console.WriteLine("上传文件成功");                                 return true;                             }                         }                     }                     catch (Exception ex)                     {                         Console.WriteLine("上传文件失败错误为" + ex.Message);                     }                     finally                     {                     }                 }                 catch (Exception ex)                 {                     Console.WriteLine("上传文件失败错误为" + ex.Message);                 }                 finally                 {                 }             }             catch (Exception ex)             {                 Console.WriteLine("上传文件失败错误为" + ex.Message);             }             return false;         }          public static bool UpLoad(Stream localFileStream, string remoteFile)         {             bool result = true;             try             {                 var ftpRequest = FtpRequest(Path + remoteFile, WebRequestMethods.Ftp.UploadFile);                 var ftpStream = ftpRequest.GetRequestStream();                 var byteBuffer = new byte[bufferSize];                 int bytesSent = localFileStream.Read(byteBuffer, 0, bufferSize);                  try                 {                     while (bytesSent != 0)                     {                         ftpStream.Write(byteBuffer, 0, bytesSent);                         bytesSent = localFileStream.Read(byteBuffer, 0, bufferSize);                     }                 }                 catch (Exception ex)                 {                     Console.WriteLine(ex.ToString());                     result = false;                 }                  localFileStream.Close();                 ftpStream.Close();             }             catch (Exception ex)             {                 Console.WriteLine(ex.ToString());                 result = false;             }             return result;         }           public static FtpWebRequest FtpRequest(string requstUrl,string method,bool closedResponse=false)         {             var reqFtp = (FtpWebRequest) WebRequest.Create(new Uri(requstUrl));             //设置连接到FTP的帐号密码             reqFtp.Credentials = new NetworkCredential(Username, Password);             //设置请求完成后是否保持连接             reqFtp.KeepAlive = false;             //指定执行命令             reqFtp.Method = method;             //指定数据传输类型             reqFtp.UseBinary = true;              if (closedResponse)             {                 var resp=reqFtp.GetResponse();                 resp.Close();             }              return reqFtp;         }          /// <summary>         /// 下载         /// </summary>         /// <param name="localFile">目的位置</param>         /// <param name="remoteFile">服务器相对位置</param>         /// <returns></returns>         public static bool Download(string localFile,string remoteFile)         {             bool check = true;             try             {                 var outputStream = new FileStream(localFile, FileMode.Create);                 var ftpRequest = FtpRequest(Path + remoteFile, WebRequestMethods.Ftp.DownloadFile);                  var response = (FtpWebResponse)ftpRequest.GetResponse();                 Stream ftpStream = response.GetResponseStream();                 long cl = response.ContentLength;                 int bufferSize = 2048;                 int readCount;                 var buffer = new byte[bufferSize];                  readCount = ftpStream.Read(buffer, 0, bufferSize);                 while (readCount > 0)                 {                     outputStream.Write(buffer, 0, readCount);                      readCount = ftpStream.Read(buffer, 0, bufferSize);                 }                 ftpStream.Close();                 outputStream.Close();                 response.Close();             }             catch (Exception err)             {                 check = false;             }             return check;         }          public static Stream Download(string remoteFile)         {             var ftpRequest = FtpRequest(Path + remoteFile, WebRequestMethods.Ftp.DownloadFile);             var response = (FtpWebResponse)ftpRequest.GetResponse();             Stream ftpStream = response.GetResponseStream();             return ftpStream;         }          /// <summary>         ///     删除文件         /// </summary>         /// <param name="fileName">服务器下的相对路径 包括文件名</param>         public static void DeleteFileName(string fileName)         {             try             {                FtpRequest(Path + fileName, WebRequestMethods.Ftp.DeleteFile,true);             }             catch (Exception ex)             {                 Console.WriteLine("删除文件出错:" + ex.Message);             }         }          /// <summary>         /// 新建目录 上一级必须先存在         /// </summary>         /// <param name="dirName">服务器下的相对路径</param>         public static void MakeDir(string dirName)         {             try             {                 FtpRequest(Path + dirName, WebRequestMethods.Ftp.MakeDirectory, true);             }             catch (Exception ex)             {                 Console.WriteLine("创建目录出错:" + ex.Message);             }         }          /// <summary>         /// 删除目录 上一级必须先存在         /// </summary>         /// <param name="dirName">服务器下的相对路径</param>         public static void DelDir(string dirName)         {             try             {                FtpRequest(Path + dirName, WebRequestMethods.Ftp.RemoveDirectory,true);             }             catch (Exception ex)             {                 Console.WriteLine("删除目录出错:" + ex.Message);             }         }          /// <summary>         ///     从ftp服务器上获得文件夹列表         /// </summary>         /// <param name="requedstPath">服务器下的相对路径</param>         /// <returns></returns>         public static List<string> GetDirctory(string requedstPath)         {             var strs = new List<string>();             try             {                 var reqFtp = FtpRequest(Path + requedstPath, WebRequestMethods.Ftp.ListDirectoryDetails);                 WebResponse response = reqFtp.GetResponse();                 var reader = new StreamReader(response.GetResponseStream()); //中文文件名                  string line = reader.ReadLine();                 while (line != null)                 {                     if (line.Contains("<DIR>"))                     {                         string msg = line.Substring(line.LastIndexOf("<DIR>") + 5).Trim();                         strs.Add(msg);                     }                     line = reader.ReadLine();                 }                 reader.Close();                 response.Close();                 return strs;             }             catch (Exception ex)             {                 Console.WriteLine("获取目录出错:" + ex.Message);             }             return strs;         }          /// <summary>         ///     从ftp服务器上获得文件列表         /// </summary>         /// <param name="requedstPath">服务器下的相对路径</param>         /// <returns></returns>         public static List<string> GetFile(string requedstPath)         {             var strs = new List<string>();             try             {                 var reqFtp = FtpRequest(Path + requedstPath, WebRequestMethods.Ftp.ListDirectoryDetails);                 WebResponse response = reqFtp.GetResponse();                 var reader = new StreamReader(response.GetResponseStream()); //中文文件名                  string line = reader.ReadLine();                 while (line != null)                 {                     if (!line.Contains("<DIR>"))                     {                         string msg = line.Substring(39).Trim();                         strs.Add(msg);                     }                     line = reader.ReadLine();                 }                 reader.Close();                 response.Close();                 return strs;             }             catch (Exception ex)             {                 Console.WriteLine("获取文件出错:" + ex.Message);             }             return strs;         }     }  View Code

主要是通过创建FtpRequest来处理Ftp相关请求。

   public static FtpWebRequest FtpRequest(string requstUrl,string method,bool closedResponse=false)         {             var reqFtp = (FtpWebRequest) WebRequest.Create(new Uri(requstUrl));             //设置连接到FTP的帐号密码             reqFtp.Credentials = new NetworkCredential(Username, Password);             //设置请求完成后是否保持连接             reqFtp.KeepAlive = false;             //指定执行命令             reqFtp.Method = method;             //指定数据传输类型             reqFtp.UseBinary = true;             if (closedResponse)             {                 var resp=reqFtp.GetResponse();                 resp.Close();             }             return reqFtp;         } 

因为在MVC网站中使用的文件流的方式。

下载:

    public static Stream Download(string remoteFile)         {             var ftpRequest = FtpRequest(Path + remoteFile, WebRequestMethods.Ftp.DownloadFile);             var response = (FtpWebResponse)ftpRequest.GetResponse();             Stream ftpStream = response.GetResponseStream();             return ftpStream;         } 

调用:

  public ActionResult DownloadFileFromFtp()         {              var filepath = "DIAView//simple.png";               var stream = FtpHelper.Download(filepath);             return File(stream, FileHelper.GetContentType(".png"),"test.png");         } 

上传:

   public static bool UpLoad(Stream localFileStream, string remoteFile)         {             bool result = true;             try             {                 var ftpRequest = FtpRequest(Path + remoteFile, WebRequestMethods.Ftp.UploadFile);                 var ftpStream = ftpRequest.GetRequestStream();                 var byteBuffer = new byte[bufferSize];                 int bytesSent = localFileStream.Read(byteBuffer, 0, bufferSize);                  try                 {                     while (bytesSent != 0)                     {                         ftpStream.Write(byteBuffer, 0, bytesSent);                         bytesSent = localFileStream.Read(byteBuffer, 0, bufferSize);                     }                 }                 catch (Exception ex)                 {                     Console.WriteLine(ex.ToString());                     result = false;                 }                  localFileStream.Close();                 ftpStream.Close();             }             catch (Exception ex)             {                 Console.WriteLine(ex.ToString());                 result = false;             }             return result;         } 

调用:

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

正文到此结束
Loading...