设为首页 收藏本站
查看: 1356|回复: 3

[经验分享] 在Window的IIS中创建FTP的Site并用C#进行文件的上传下载

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2014-1-3 09:10:19 | 显示全部楼层 |阅读模式
在Window的IIS中创建FTP的Site并用C#进行文件的上传下载

文件传输协议 (FTP) 是一个标准协议,可用来通过 Internet 将文件从一台计算机移到另一台计算机。 这些文件存储在运行 FTP 服务器软件的服务器计算机上。 然后,远程计算机可以使用 FTP 建立连接,并从服务器读取文件或将文件复制到服务器。 FTP 服务器与 HTTP 服务器(即 Web 服务器)的相似之处在于可以使用 Internet 协议与之通信。 但是,FTP 服务器不运行网页;它只是向/从远程计算机发送/接收文件。

可以将 Internet 信息服务 (IIS) 配置为作为 FTP 服务器来运行。 这样,其他计算机便可以连接到服务器并将文件复制到服务器或者从服务器复制文件。 例如,如果您在自己的计算机上承载网站,并且希望允许远程用户连接到您的计算机并将他们的文件复制到服务器,则可以将 IIS 配置为充当 FTP 服务器。

本文主要讲解一下,在Window的IIS中创建FTP的Site并用C#进行文件的上传下载。


1): 首先展示一下我的Window环境

02092717-186331073efe4631a0c58b8a404cb862.jpg


2): 在配置环境之前,我们要保证相应的Window的feature都已经开启了,如下图所示

02092736-447d89c2ad8745a889ebdf5efdbf851b.jpg


3): 打开我们的IIS Manager,在Sites的节点点击鼠标右键,选择Add FTP Site

02092753-7806cbfbabec40e1b7b8a3bb78a51c88.jpg


4): 接上图,之后会出现如下视图,我们可以填写对应的 FTP site name,然后选择本地某一个磁盘的folder作为此 FTP site 的 Physical path

02092803-4b9f503ec59540f38af059bb63d16c57.jpg


5): 填写好必要的信息之后,我们点击 Next 进入如下界面,可以看出FTP对应的端口号位21,我们这里选择了Allow SSL就是对传输的内容进行加密【即:所谓的SFTP,但是依旧使用的是FTP协议,这与http和https的关系不完全类似】

【注:引文---我们都知道FTP对应的端口应该是21,为什么又冒出来一个20呢?其实,我们们进行FTP文件传输中,客户端首先连接到FTP服务器的21端口,进行用户的认证,认证成功后,当我们要传输文件时,服务器会开一个端口为20来进行传输数据文件,也就是说,端口20才是真正传输所用到的端口,端口21只用于FTP的登陆认证。我们平常下载文件时,会遇到下载到99%时,文件不完成,不能成功的下载。其实是因为文件下载完毕后,还要在21端口再行进行用户认证,而我们下载文件的时间如果过长,客户机与服务器的21端口的连接会被服务器认为是超时连接而中断掉,就是这个原因。解决方法就是设置21端口的响应时间。】

02092814-704528cbe8624e6cbbe5bc2f055e143b.jpg


6): 接上图,点击Next按钮之后,我们将EricSun_FTP这个用户赋予对应的权限,之后的程序中我们也用此用户的信息进行登录认证

02092836-8381d90de1344ad0b893714d7fa72ba9.jpg


7): 上面的步骤都设置完之后,我们用 ftp://192.168.181.133 【当然了这里要换成你自己环境的 ip 地址】来访问,会直接映射到我们之前设置的物理地址 E盘的 FTP 文件夹

【如果是第一次访问的话,会弹出一个界面让你输入用户名和密码进行认证,这里省略】

02092849-97c559d409674112b39c526e4fc529a0.jpg

【【 更加官方的配置过程我们可以访问此链接:http://msdn.microsoft.com/zh-cn/library/6ws081sa(v=vs.100).aspx 】】


8): 配置好了这样的一个 FTP site之后,可以用如下C#代码进行访问来处理文件的上传和下载

public static void DownloadByFtp(string uri, MemoryStream stream, bool isInternalAuth, string sftpUserName, string sftpPassword)        {            if (!uri.Contains("ftp://"))                uri = "ftp://" + uri;                            FtpWebRequest request = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri));            if (!isInternalAuth)                request.Credentials = new NetworkCredential(sftpUserName, sftpPassword);            request.KeepAlive = false;            request.Method = WebRequestMethods.Ftp.DownloadFile;            request.UseBinary = true;
            FtpWebResponse response = (FtpWebResponse)request.GetResponse();            Stream responseStream = response.GetResponseStream();            int len = 0;
            do            {                byte[] buffer = new byte[2048];                len = responseStream.Read(buffer, 0, buffer.Length);                stream.Write(buffer, 0, len);            } while (len > 0);
            responseStream.Close();            response.Close();
            stream.Position = 0;        }

        public static void UploadByFtp(string ftpAddress, MemoryStream fileStream, string folderName, string fileName, string sftpUsername, string sftpPassword)        {            string uri = string.Empty;            if (ftpAddress.Contains("ftp://"))            {                uri = ftpAddress;            }            else            {                uri = "ftp://" + ftpAddress;            }            if (!string.IsNullOrEmpty(folderName))             {                uri = uri.TrimEnd('/') + "/" + folderName;            }            if (!string.IsNullOrEmpty(fileName))            {                uri = uri.TrimEnd('/') + "/" + fileName;            }            FtpWebRequest request = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri));            request.Credentials = new NetworkCredential(sftpUsername, sftpPassword);            request.KeepAlive = false;            request.Method = WebRequestMethods.Ftp.UploadFile;            request.UseBinary = true;            request.ContentLength = fileStream.Length;
            byte[] buffer = fileStream.GetBuffer();            Stream stream = request.GetRequestStream();            stream.Write(buffer, 0, buffer.Length);            stream.Close();        }
9): 这里提供了另外一些比较常用的方法,可以根据自己的需要进行对应的调整~~
/// <summary>        /// upload the file to ftp server.        /// </summary>        public void UploadByFtp(string ftpAddress, string filePath, string name)        {            FileStream fs = null;            Stream stream = null;            string uri = string.Empty;            FileInfo fi = new FileInfo(filePath);
            if (ftpAddress.Contains("ftp://"))                uri = ftpAddress + name;            else                uri = "ftp://" + ftpAddress + name;
            try            {                FtpWebRequest request = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri));                request.Credentials = new NetworkCredential(_username, _password);                request.KeepAlive = false;                request.Method = WebRequestMethods.Ftp.UploadFile;                request.UseBinary = true;                request.ContentLength = fi.Length;
                byte[] buffer = new byte[2048];                fs = fi.OpenRead();                stream = request.GetRequestStream();                int len = fs.Read(buffer, 0, buffer.Length);                while (len != 0)                {                    stream.Write(buffer, 0, len);                    len = fs.Read(buffer, 0, buffer.Length);                }            }            catch (Exception e)            {                throw e;            }            finally            {                if (stream != null)                    stream.Close();                if (fs != null)                    fs.Close();            }        }
        /// <summary>        /// upload the file to ftp server. only for cover image process.        /// </summary>        public void UploadByFtp(string ftpAddress, MemoryStream fileStream, string fileName)        {            string uri = string.Empty;            if (ftpAddress.Contains("ftp://"))                uri = ftpAddress;            else                uri = "ftp://" + ftpAddress;            FtpWebRequest request = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri + fileName));            request.Credentials = new NetworkCredential(_username, _password);            request.KeepAlive = false;            request.Method = WebRequestMethods.Ftp.UploadFile;            request.UseBinary = true;            request.ContentLength = fileStream.Length;
            byte[] buffer = fileStream.GetBuffer();            Stream stream = request.GetRequestStream();            stream.Write(buffer, 0, buffer.Length);            stream.Close();        }
        /// <summary>        /// delete the file from ftp server by ftp protocol.        /// </summary>        public void DeleteByFtp(string ftpAddress, string fileName)        {            string uri = string.Empty;            if (ftpAddress.Contains("ftp://"))                uri = ftpAddress + fileName;            else                uri = "ftp://" + ftpAddress + fileName;            FtpWebRequest request = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri));            request.Credentials = new NetworkCredential(_username, _password);            request.KeepAlive = false;            request.Method = WebRequestMethods.Ftp.DeleteFile;
            request.GetResponse().Close();        }
        public void DownloadByFtp(string uri, MemoryStream stream, bool isInternalAuth)        {            if (!uri.Contains("ftp://"))                uri = "ftp://" + uri;                            FtpWebRequest request = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri));            if (!isInternalAuth)                request.Credentials = new NetworkCredential(_username, _password);            request.KeepAlive = false;            request.Method = WebRequestMethods.Ftp.DownloadFile;            request.UseBinary = true;
            FtpWebResponse response = (FtpWebResponse)request.GetResponse();            Stream responseStream = response.GetResponseStream();            int len = 0;
            do            {                byte[] buffer = new byte[2048];                len = responseStream.Read(buffer, 0, buffer.Length);                stream.Write(buffer, 0, len);            } while (len > 0);
            responseStream.Close();            response.Close();
            stream.Position = 0;        }
        /// <summary>        /// create the directory on ftp server.        /// </summary>        public void CreateDirectory(string ftpAddress, string directory)        {            string uri = string.Empty;            if (ftpAddress.Contains("ftp://"))                uri = ftpAddress;            else                uri = "ftp://" + ftpAddress;            FtpWebRequest request = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri + directory));            request.Credentials = new NetworkCredential(_username, _password);            request.KeepAlive = false;            request.Method = WebRequestMethods.Ftp.MakeDirectory;
            request.GetResponse().Close();        }
        /// <returns>0: successful; 1: can not delete(e.g. have sub-dirs or sub-files); -1: failure</returns>        public int RemoveDirectory(string ftpAddress, string directory)        {            int result;            string uri = string.Empty;            if (ftpAddress.Contains("ftp://"))                uri = ftpAddress;            else                uri = "ftp://" + ftpAddress;            FtpWebRequest request = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri + directory));            request.Credentials = new NetworkCredential(_username, _password);            request.KeepAlive = false;            request.Method = WebRequestMethods.Ftp.RemoveDirectory;
            try            {                request.GetResponse().Close();
                result = 0;            }            catch (WebException we)            {                if (((FtpWebResponse)we.Response).StatusCode == FtpStatusCode.ActionNotTakenFileUnavailable)                {                    result = -1;                }                else                {                    result = 1;                    throw we;                }            }            catch (Exception e)            {                result = 1;                throw e;            }
            return result;        }
        public string[] GetFileList(string ftpAddress, string directory, bool isInternalAuth)        {            string uri = string.Empty;            StringBuilder result = new StringBuilder();            if (ftpAddress.Contains("ftp://"))                uri = ftpAddress;            else                uri = "ftp://" + ftpAddress;
            FtpWebRequest request = null;            if (!string.IsNullOrEmpty(directory))                request = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri + directory));            else                request = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri));
            if (!isInternalAuth)                request.Credentials = new NetworkCredential(_username, _password);            request.KeepAlive = false;            request.Method = WebRequestMethods.Ftp.ListDirectory;            WebResponse response = request.GetResponse();
            StreamReader reader = new StreamReader(response.GetResponseStream());            string line = reader.ReadLine();            while (line != null)            {                result.Append(line);                result.Append("/");                line = reader.ReadLine();            }
            reader.Close();            response.Close();
            if (result.Length > 0)                return result.ToString().TrimEnd('/').Split('/');            else                return null;        }
        /// <returns>0: exist; -1: not exist; 1: unknown (other cause)</returns>        public int IsExist(string ftpAddress, string directory)        {            string uri = string.Empty;            int result;            if (ftpAddress.Contains("ftp://"))                uri = ftpAddress;            else                uri = "ftp://" + ftpAddress;
            FtpWebRequest request = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri + directory));            request.Credentials = new NetworkCredential(_username, _password);            request.KeepAlive = false;            request.Method = WebRequestMethods.Ftp.ListDirectory;
            try            {                request.GetResponse().Close();
                result = 0;            }            catch (WebException we)            {                if (((FtpWebResponse)we.Response).StatusCode == FtpStatusCode.ActionNotTakenFileUnavailable)                {                    result = -1;                }                else                {                    result = 1;                    throw we;                }            }            catch (Exception e)            {                result = 1;                throw e;            }
            return result;        }


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-13099-1-1.html 上篇帖子: IIS上的错误与解决方案 下篇帖子: IIS 调用Microsoft.Office.Interop.Word.Documents.Open 返回为null

尚未签到

发表于 2014-1-3 09:53:22 | 显示全部楼层
男人,那有一个不好色的。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

尚未签到

发表于 2014-1-3 14:02:06 | 显示全部楼层
花开的风雨过后,阳光依旧

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

尚未签到

发表于 2014-1-3 16:37:41 | 显示全部楼层
我们好不容易,我们身不由己。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表