Home  >  Article  >  Web Front-end  >  FTP file management

FTP file management

php中世界最好的语言
php中世界最好的语言Original
2018-03-16 14:22:416085browse

This time I will bring you the file management of FTP. What are the precautions for managing FTP files? The following is a practical case, let’s take a look.

Because the website has download files that need to be separated from the website, FTP is used to manage the files. Here is a simple arrangement.

1. Installing FTP

is the same as installing iis. Check them all.

Set the site name and path.

Set ip.

Identity authorization selects all users and can read and write.

After completion, IIS will appear:

2. Add FTP user

Computer- ->Management-->Local Users and Groups.

Add user, description is FTP.

Here you need to set the user's password method and remove the option "The user must change their password the next time they log in".

Otherwise, the login will be unsuccessful. Reported 530 error.

3. Test login

ftp ip and you can access it. Displaying 230 user logged in indicates successful login.

##4. Upload and download

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

Mainly handles Ftp by creating FtpRequest Related requests.

  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;
        }

Because of the file flow method used in MVC websites.

Download:

   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;
        }

Call:

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

Upload:

  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;
        }

Call:

      [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 can also be set differently for different users Directory, I believe that after reading the case in this article, you have mastered the method. For more exciting information, please pay attention to other related articles on the php Chinese website!

Recommended reading:

How to build a server with nodejs

How to deploy Node.JS to Heroku

The above is the detailed content of FTP file management. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn