在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 ...
随机推荐
- POJ 3414
http://poj.org/problem?id=3414 这是一个广搜的题目,不难,就是有些许麻烦.对于练习还是个不错的题目. 题意就是给你两个杯子,这两个杯子的容量分别为a和b,要你通过一些操作 ...
- iOS 开启data protection 的方法
我这里说的data protection,指的是设备设置密码后,如果设备锁屏,并且当前解锁需要密码(有时可能因为自己的设定,导致会再几小时后才需要密码),这时应用程序处于加密状态,无法从外部读取.如果 ...
- 安装courier-authlib找不到mysqlclient.so文件
使用configure配置的时候使用 --with-authmysql指明libmysqlclient.so的存放位置即可
- 20151130test->20160530
过了6个月了,有些长进么?哈 go go go 开源镜像 http://mirrors.163.com/
- jquery格式化时间
使用方法: new Date().format("yyyy-MM-dd hh:mm:ss"); 格式: Date.prototype.format = function (form ...
- maven加载本地lib下的jar包(pom.xml)
1.将本地jar放置到仓储库在jar包目录下 mvn install:install-file -Dfile=sqljdbc4.jar -DgroupId=com.microsoft.sqlserve ...
- 【Python】range和xrange区别
转自:http://www.cnblogs.com/zhangjing0502/archive/2012/05/16/2503880.html range 函数说明:range([start,] ...
- s:iterator,s:if与OGNL的嵌套使用
今天在写代码时,遇到个如下问题,要求当前登陆用户的id与系统参数类型代码所属维护人的id相同时,显示单选框.如下效果: 代码如下: <s:iterator value="vo.page ...
- ajax+bootstrap做弹窗
建页面,引入bootstrap弹窗 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" " ...
- Linear regression with multiple variables(多特征的线型回归)算法实例_梯度下降解法(Gradient DesentMulti)以及正规方程解法(Normal Equation)
,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, ,, , ...