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 = ""; //GetAppConfig("password"); //ftp密码
// 2M 可能不够
private const int bufferSize = ; /// <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'), );
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 -;
}
} /// <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 = ;
var b = new byte[BufferLength];
int i;
while ((i = fs.Read(b, , BufferLength)) > )
{
stream.Write(b, , 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, , bufferSize); try
{
while (bytesSent != )
{
ftpStream.Write(byteBuffer, , bytesSent);
bytesSent = localFileStream.Read(byteBuffer, , 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 = ;
int readCount;
var buffer = new byte[bufferSize]; readCount = ftpStream.Read(buffer, , bufferSize);
while (readCount > )
{
outputStream.Write(buffer, , readCount);
readCount = ftpStream.Read(buffer, , 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>") + ).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().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, , bufferSize); try
{
while (bytesSent != )
{
ftpStream.Write(byteBuffer, , bytesSent);
bytesSent = localFileStream.Read(byteBuffer, , 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还可以设置不同用户有不同的目录,是以为记。
FTP文件管理的更多相关文章
- C# winfrom 模拟ftp文件管理
从网上找到的非常好用的模拟ftp管理代码,整理了一下,希望对需要的人有帮助 using System; using System.Collections.Generic; using System.T ...
- FTP服务器上删除文件夹失败
很多人都知道:要删除FTP服务器上的文件夹时,必须确保文件夹下面没有其他文件,否则会删除失败! 可是,有些服务器考虑到安全等因素,通常会隐藏以点开始的文件名,例如“.test.txt”.于是,有的坏人 ...
- Java语言实现简单FTP软件------>上传下载管理模块的实现(十一)
1.上传本地文件或文件夹到远程FTP服务器端的功能. 当用户在本地文件列表中选择想要上传的文件后,点击上传按钮,将本机上指定的文件上传到FTP服务器当前展现的目录,下图为上传子模块流程图 选择好要上传 ...
- FTP文传协议的应用
我开发的项目中一直用到都是AFNetworking上传图片的方法,最近老大说要用FTP上传,网上的资料很少,毕竟这种上传方式现在用的不多了,于是花了一天时间学习了FTP文件传输协议.下面是我的个人理解 ...
- Web 项目可能会用到的20款优秀的开源工具
开源的应用程序和它们的源代码可以免费获得,因为版权是属于任何进行过修改或者提交代码的人.大多数提供开源软件的公司都可以建立行业标准,因此可以获得有利的竞争优势. 很多的开源应用程序和工具都有很强的替代 ...
- 令人惊叹的Visual Studio Code插件
vscode是一款开源且优秀的编辑器,接下来让我吐血推荐一下我工作使用过的令人惊叹的Visual Studio Code插件. 代码编辑插件 vscode-color-highlight ------ ...
- PHP基础教程 10款人气暴涨的PHP开源工具
若想创建动态而又新颖的Web应用程序,PHP便是理想的选择.不用说,在Web开发世界里,PHP是最流行的语言之一.一些非常好用的PHP开源工具着实拯救了不少开发任务繁重的PHP开发 人员,减轻他们的开 ...
- 10款人气暴涨的PHP开源工具
若想创建动态而又新颖的Web应用程序,PHP便是理想的选择.不用说,在Web开发世界里,PHP是最流行的语言之一.一些非常好用的PHP开源工具着实拯救了不少开发任务繁重的PHP开发人员,减轻他们的开发 ...
- Web文件管理:elFinder.Net(支持FTP)
elFinder 是一个基于 Web 的文件管理器,灵感来自 Mac OS X 的 Finder 程序. elFinder.Net是.Net版本的一个Demo,使用ASP.NET MVC 4集成,可以 ...
随机推荐
- 《Linux多线程服务端编程:使用muduo C++网络库》上市半年重印两次,总印数达到了9000册
<Linux多线程服务端编程:使用muduo C++网络库>这本书自今年一月上市以来,半年之内已经重印两次(加上首印,一共是三次印刷),总印数达到了9000册,这在技术书里已经算是相当不错 ...
- svn安装与其服务器搭建
1.概述:SVN为程序开发团队常用的代码管理,版本控制软件. 2.工具: 1) TortoiseSVN-1.8.4.24972-win32-svn-1.8.5.msi SVN安装包. 2)setup ...
- PIL show() 报错
将 PIL 安装目录下的 ImageShow.py 文件的第 99 行:(我的 Python 安装在 D:\Program Files\python 2.6,那 ImageShow.py 文件在: ...
- 说说Statement、PreparedStatement和CallableStatement的异同(转)
1.Statement.PreparedStatement和CallableStatement都是接口(interface). 2.Statement继承自Wrapper.PreparedStatem ...
- Maven中配置默认JDK版本
使用Maven构建项目时,默认是使用jdk1.3版本,目前很多使用泛型的项目肯定是无法通过编译,除了修改项目的pom文件外,还可以在Maven的配置文件settings.xml中添加如下配置来解决: ...
- vs2013卸载后重新安装不能用了,如何解决
vs2013卸载后重新安装不能用了 据说VS卸载后有残留文件,估计是注册文件没删除,弄了很多方法,最后只有重装.你可以下载一个cclearn清理注册表,再装试试 我卸载完用360清理了一下 之后再安装 ...
- Codeforces Round #379 (Div. 2) Analyses By Team:Red & Black
A.Anton and Danik Problems: 给你长度为N的,只含'A','D'的序列,统计并输出何者出现的较多,相同为"Friendship" Analysis: lu ...
- 由Selenium1转变为Selenium2所遇到的问题
1.使用ant脚本运行测试,报NoClassDefError,但使用junit方式运行或debug,都没有错误. 原因:找不到包,但具体是哪个包,不清楚:且为何使用junit方式运行就没有问题,也不清 ...
- 学习codeIgniter的一点小感受
用CI好几天了,最终还是放弃用CI做完整的项目,感觉CI在前后端的交互上还比较差,比如说用户表单验证,仍然是需要把数据提交给服务器之后才能显示逻辑判断的结果.而这一点明显是相对落后了. 但不可否认CI ...
- C.C++把整个文件内容读进一个buffer中
原创文章,未经本人允许禁止转载. //C方式, 调用的函数繁多 //fopen,fseek,ftell,fseek,malloc,fread,fclose,free. void foo() { FIL ...