FTP文件管理

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

1.安装FTP

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

设置站点名称和路径。

设置ip。

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

完成之后 IIS就会出现:

2.添加FTP用户

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

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

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

3.测试登录

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

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

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

时间: 2024-08-03 17:42:15

FTP文件管理的相关文章

2015-2:新手入门之菜鸟也要用kali

kali基于debian7,在虚拟机安装的时候就可以看出,vmware把kali识别为debian7,不知道为什么很多文章都说参考ubuntu的操作,我记得bt5参考ubuntu,但是操作看上去的确很多通用的,而且,看到kali的桌面以后,我第一个想起的是rhel7,或许是用的习惯了. 个人习惯,由于我第一个接触的Linux系统是redhat,习惯现配yum源,但是kali貌似不叫yum. 系统提示更新什么我没管,最后终端一些操作会完成更新的. 1>配置源 不要和原来的内容挨的太近,保留原内容就

可视化服务器管理控制面板Plesk,让您专心于网站运营

一直以来让我很头疼的问题就是对服务器的管理.自己搞了个站点,本来想着要专心经营下,但是每天在管理服务器这件事情上就花费了我大量的时间,时不时出现些问题还需要各种找资料问人.当然,也可能是我对网站和服务器管理那套技术不算精通.后来,我实在忍受不了就希望能在网上找一款面板能够让我摆脱这些问题. 网上各种推荐的都有,但是服务器管理面板国内外一共也没几款,经过多方面对比和试用,最终我决定用Plesk.Plesk是大名鼎鼎的Parallels公司旗下的一款专用于管理主机的软件.起初,我也是跟随着名气而来,

PHP基础教程 10款人气暴涨的PHP开源工具

若想创建动态而又新颖的Web应用程序,PHP便是理想的选择.不用说,在Web开发世界里,PHP是最流行的语言之一.一些非常好用的PHP开源工具着实拯救了不少开发任务繁重的PHP开发 人员,减轻他们的开发负担.这些PHP开源工具改善了他们的工作流程,使他们的开发任务更简便和快捷.本人整理了 10 款最具人气的PHP开源工具分享给大家,欢迎交流分享.www.lampbrother.net/subject.html Monsta FTP 如果你想在浏览器中设置一个FTP文件管理,你需要有一款像Mons

PHP:40+开发工具推荐

PHP是为Web开发设计的服务器脚本语言,但也是一种通用的编程语言.超过2.4亿个索引域使用PHP,包括很多重要的网站,例如Facebook.Digg和WordPress.和其它脚本语言相比,例如Python和Ruby,Web开发者有很多不错的理由皮偏爱PHP. 对于PHP开发者,在互联网上有很多可用的开发工具,但是找到一个合适的PHP开发工具是很难的,需要花费很多努力和时间.今天,就为开发者介绍45个方便的PHP工具. Plates Plates是一个简单易用的PHP模板系统.Plates是为

Vue Cli搭建域名服务器常见问题

Vue Cli搭建域名服务器常见问题 Vue Cli不使用反向代理配置域名 通过npm run serve命令执行Vue项目只能通过IP地址来访问,即使域名服务中设置DNS依然访问不到.有以下三种解决办法: 1.修改项目根目录下[email protected]\cli-service\lib\options.js文件 //第133行 devServer: { /* open: process.platform === 'darwin', host: '0.0.0.0',//改为域名 port:

远程控制利器TeamViewer QuickSupport 14中文版

TeamViewer QuickSupport 14中文版是TeamViewer官方推出的TeamViewer系列软件中的一款专门用于临时性即时远程桌面连接的软件,在功能上与TeamViewer Host类似,也是用于将电脑设置为可供连接的服务器端,但它只能提供快速性的连接,连接中断或程序关闭后即失效,适用于临时性的演示或者远程支持,简单而小巧的客户模块,无需安装即可立即运行,不需要管理权限. TeamViewer QuickSupport 14 Mac版安装教程 注意!如需ios版本,自行在A

Web文件管理:elFinder.Net(支持FTP)

elFinder 是一个基于 Web 的文件管理器,灵感来自 Mac OS X 的 Finder 程序. elFinder.Net是.Net版本的一个Demo,使用ASP.NET MVC 4集成,可以方便的使用Web管理本地文件. GitHub地址:https://github.com/leniel/elFinder.Net 不过目前的elFinder.Net只支持管理本地文件夹,但是我需要的是管理FTP上的文件功能,在搜索一番无果后,就决定自己扩展了一下功能,让elFinder.Net也可以用

bash命令/文件管理-bash命令

命令解释器,我们可以SHELL实现对Linux系统的管理例如: 1. 文件管理 2. 用户管理 3. 权限管理 4. 磁盘管理 5. 软件管理 6. 网络管理 ...... 内容提要: bash shell提示符 shell 语法 bash 特性 Linux获得帮助 一.bash shell提示符: =================== [[email protected] ~]# date 2012年 10月 24日 星期三 09:38:54 CST [[email protected] ~

bash命令/文件管理-文件管理

=============BASH Shell对文件进行管理============== 创建.复制.删除.移动.查看.编辑.压缩.查找 内容提要: Linux目录结构 文件定位 路径 文件管理 一.Linux目录结构 Windows: 以多根的方式组织文件  C:\   D:\   E:\ Linux:   以单根的方式组织文件  / /目录结构: FHS [[email protected] ~]# ls / bin     dev   lib         media  net   ro