FTP文件管理

由於網站有下載文件須要和網站分離,使用到了FTP管理文件,這裏作一個簡單的整理。服務器

1.安裝FTP

 和安裝iis同樣。所有勾選。ide

 設置站點名稱和路徑。測試

 

 設置ip。網站

 

 身份受權選擇全部用戶,能夠讀寫。ui

  

 完成以後 IIS就會出現:url

 

2.添加FTP用戶

計算機-->管理-->本地用戶和組。 添加用戶,描述爲FTP。spa

這裏要設置用戶的密碼方式,去掉「用戶下次登陸時必須更改密碼」的選項。code

 

 否則會登陸不成功。報530錯誤。blog

3.測試登陸

ftp ip 就能夠訪問。顯示230 user logged in 表示登陸成功。 ip

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還能夠設置不一樣用戶有不一樣的目錄,是覺得記。

相關文章
相關標籤/搜索