在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 ...
随机推荐
- PHP输出Excel两种方法
2016年3月23日 16:43:51 星期三 第一种: 输出html+css格式, 打开后用Excel软件的"另存为"功能保存为正规的表格格式 public function e ...
- h5页面的公共css
/*reset*/body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,code,form,fieldset,legend,input,button,tex ...
- iOS开发学习网站汇总
*本文转自CocoaChina 原文:11 Insanely Great iOS Developers Sites永不止步地向他人学习 我相信,要想从一个"还不错"的人变成一个卓越 ...
- Python:IDLE清屏
清屏很简单,为IDLE增加一个清屏的扩展ClearWindow即可. 首先下载clearwindow.py(点击可直接下载,不能下载的可以右键保存,格式为py结尾), 将这个文件放到Python安装目 ...
- Gson简要使用笔记
最近在做一个java web service项目,需要用到jason,本人对java不是特别精通,于是开始搜索一些java平台的json类库. 发现了google的gson,因为之前对于protoco ...
- HDU 5920 Ugly Problem 高精度减法大模拟 ---2016CCPC长春区域现场赛
题目链接 题意:给定一个很大的数,把他们分为数个回文数的和,分的个数不超过50个,输出个数并输出每个数,special judge. 题解:现场赛的时候很快想出来了思路,把这个数从中间分为两部分,当位 ...
- Linux内核补丁升级
如果机器已经联网,直接利用包管理工具更新,需要注意的是现在3.0以上的内核引入了签名机制,需要导入签名的key,参考步骤如下: 1.导入keyrpm --import https://www.elre ...
- ASIHTTPRequest详解 [经典]
ASIHTTPRequest 对CFNetwork API进行了封装,并且使用起来非常简单,用Objective-C编写,可以很好的应用在Mac OS X系统和iOS平台的应用程序中.ASIHTTPR ...
- August 24th 2016 Week 35th Wednesday
Storms make trees take deeper roots. 暴风雨能使大树的根扎得更深. If the trees already have deep roots, then the s ...
- 对于类的双重调用的demo
代码如下: package cao.com.duixiang; public class TestCCircle { public static void main(String[] args) { ...