在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环境

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

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

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

5): 填写好必要的信息之后,我们点击 Next 进入如下界面,可以看出FTP对应的端口号位21,我们这里选择了Allow SSL就是对传输的内容进行加密【即:所谓的SFTP,但是依旧使用的是FTP协议,这与http和https的关系不完全类似】
【注:引文---我们都知道FTP对应的端口应该是21,为什么又冒出来一个20呢?其实,我们们进行FTP文件传输中,客户端首先连接到FTP服务器的21端口,进行用户的认证,认证成功后,当我们要传输文件时,服务器会开一个端口为20来进行传输数据文件,也就是说,端口20才是真正传输所用到的端口,端口21只用于FTP的登陆认证。我们平常下载文件时,会遇到下载到99%时,文件不完成,不能成功的下载。其实是因为文件下载完毕后,还要在21端口再行进行用户认证,而我们下载文件的时间如果过长,客户机与服务器的21端口的连接会被服务器认为是超时连接而中断掉,就是这个原因。解决方法就是设置21端口的响应时间。】

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

7): 上面的步骤都设置完之后,我们用 ftp://192.168.181.133 【当然了这里要换成你自己环境的 ip 地址】来访问,会直接映射到我们之前设置的物理地址 E盘的 FTP 文件夹
【如果是第一次访问的话,会弹出一个界面让你输入用户名和密码进行认证,这里省略】

【【 更加官方的配置过程我们可以访问此链接: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 = ; do
{
byte[] buffer = new byte[];
len = responseStream.Read(buffer, , buffer.Length);
stream.Write(buffer, , len);
} while (len > ); responseStream.Close();
response.Close(); stream.Position = ;
} 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, , 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[];
fs = fi.OpenRead();
stream = request.GetRequestStream();
int len = fs.Read(buffer, , buffer.Length);
while (len != )
{
stream.Write(buffer, , len);
len = fs.Read(buffer, , 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, , 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 = ; do
{
byte[] buffer = new byte[];
len = responseStream.Read(buffer, , buffer.Length);
stream.Write(buffer, , len);
} while (len > ); responseStream.Close();
response.Close(); stream.Position = ;
} /// <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 = ;
}
catch (WebException we)
{
if (((FtpWebResponse)we.Response).StatusCode == FtpStatusCode.ActionNotTakenFileUnavailable)
{
result = -;
}
else
{
result = ;
throw we;
}
}
catch (Exception e)
{
result = ;
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 > )
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 = ;
}
catch (WebException we)
{
if (((FtpWebResponse)we.Response).StatusCode == FtpStatusCode.ActionNotTakenFileUnavailable)
{
result = -;
}
else
{
result = ;
throw we;
}
}
catch (Exception e)
{
result = ;
throw e;
} return result;
}
在Window的IIS中创建FTP的Site并用C#进行文件的上传下载的更多相关文章
- 创建FTP的Site并用C#进行文件的上传下载
创建FTP的Site并用C#进行文件的上传下载 文件传输协议 (FTP) 是一个标准协议,可用来通过 Internet 将文件从一台计算机移到另一台计算机. 这些文件存储在运行 FTP 服务器软件的服 ...
- python使用ftplib模块实现FTP文件的上传下载
python已经默认安装了ftplib模块,用其中的FTP类可以实现FTP文件的上传下载 FTP文件上传下载 # coding:utf8 from ftplib import FTP def uplo ...
- python中使用paramiko模块并实现远程连接服务器执行上传下载
paramiko模块 paramiko是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接. 因此,如果需要使用SSH从一个平台连接到另外一个平台,进行一系 ...
- 记crt 在windows与linux服务器之间利用ftp进行文件的上传下载
我们首先来熟悉一些相关的命令以及操作: ls #展示linux服务器当前工作目录[你连接sftp时所处的目录]下的所有文件以及文件夹 lcd F:\niki #绑定你在windo ...
- Java使用SFTP和FTP两种连接方式实现对服务器的上传下载 【我改】
[]如何区分是需要使用SFTP还是FTP? []我觉得: 1.看是否已知私钥. SFTP 和 FTP 最主要的区别就是 SFTP 有私钥,也就是在创建连接对象时,SFTP 除了用户名和密码外还需要知道 ...
- Java实现FTP批量大文件上传下载篇1
本文介绍了在Java中,如何使用Java现有的可用的库来编写FTP客户端代码,并开发成Applet控件,做成基于Web的批量.大文件的上传下载控件.文章在比较了一系列FTP客户库的基础上,就其中一个比 ...
- 在window的IIS中搭配Php的简单方法
在window的IIS中搭配Php的简单方法.搭配php的时候找到的一个超级简单方法 关键的核心是 PHP Manager for IIS 这是微软开发的一个项目,使用它可以在window下最方便简单 ...
- PHP操作FTP类 (上传下载移动创建等)
使用PHP操作FTP-用法 Php代码 收藏代码 <? // 联接FTP服务器 $conn = ftp_connect(ftp.server.com); // 使用username和passwo ...
- Spring学习---Spring中利用组件实现从FTP服务器上传/下载文件
FtpUtil.java import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundExcepti ...
随机推荐
- How to raise exceptions in Delphi
uses SysUtils; procedure RaiseMyException; begin raise Exception.Create('Hallo World!'); end;
- Slave SQL: Error 'Incorrect string value ... Error_code: 1366
背景: 主从环境一样,字符集是utf8. Slave复制报错,平时复制都正常也没有出现过问题,今天突然报错: :: :: :: :: Error_code: :: perror 1366 MySQL ...
- percona-toolkit 之 【pt-deadlock-logger】说明
摘要: 死锁:是指两个或则多个事务在同一个资源上相互占用,并请求锁定对方占用的资源,而导致恶性循环的现象:当产生死锁的时候,MySQL会回滚一个小事务的SQL,确保另一个完成.上面是死锁的概念,而在M ...
- ffmpeg-20160517-git-bin-v2
ESC 退出 0 进度条开关 1 屏幕原始大小 2 屏幕1/2大小 3 屏幕1/3大小 4 屏幕1/4大小 S 下一帧 [ -2秒 ] +2秒 ; -1秒 ' +1秒 下一个帧 -> -5秒 f ...
- springMVC中ajax的使用
springMVC中使用ajax有两种方法,第一种是根据servletAPI来使用ajax,第二种是根据springMVC给我们提供的API来使用. 一.根据servletAPI: springMVC ...
- 几种Linux 查询外网出口IP的方法
Curl 纯文本格式输出: curl icanhazip.com curl ifconfig.me curl curlmyip.com curl ip.appspot.com curl ipinfo. ...
- 1.openstack之mitaka搭建基本配置
介绍:本次案列为基本的三节点部署 注:搭建所需要的包可以联系QQ:22102107获取 一:网络: 1.管理网络:192.168.11.0/24 2.数据网络:1.1.1.0/24 注:每个节点两个网 ...
- js中apply,call的用法
最近一直在用 js 写游戏服务器,我也接触 js 时间不长,大学的时候用 js 做过一个 H3C 的 web的项目,然后在腾讯实习的时候用 js 写过一些奇怪的程序,自己也用 js 写过几个的网站.但 ...
- asp.net 上一条和下一条记录的显示
这里我用的是input标签跳转页面的: 前台aspx页面中: <input class="btn" id="btnSetForm" type=" ...
- Vector_h
#ifndef VECTOR_H #define VECTOR_H #include <algorithm> template<typename Object> class V ...