Web.Config
<!--FTP START-->
<add key="FtpServerIP" value="172.20.171.74:21"/>
<add key="FtpUserID" value="XXXXXX"/>
<add key="FtpPassword" value="XXXXXX"/>
<add key="FtpTempFile" value="FtpTempFile"/>
<!--FTP END-->
上传页面
using System;
using System.Collections.Generic;
using System.Configuration;
using System.IO;
using System.Linq;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using WebUtility;
namespace PlatForm
{
public partial class FTPDemo : System.Web.UI.Page
{
private string FtpServerIP = ConfigurationManager.AppSettings["FtpServerIP"];
private string FtpUserID = ConfigurationManager.AppSettings["FtpUserID"];
private string FtpPassword = ConfigurationManager.AppSettings["FtpPassword"];
protected void Page_Load(object sender, EventArgs e)
{
string ftpPath = string.Empty;
#region 上传
if (File.Exists("D:\\1.txt"))
{
try
{
FTPHelper helper = new FTPHelper(FtpServerIP, "", FtpUserID, FtpPassword);
ftpPath = helper.Upload("D:\\1.txt", "MainPlan");
}
catch (Exception ex)
{
}
}
#endregion
}
}
}
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="FTPDemo.aspx.cs" Inherits="PlatForm.FTPDemo" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title></title>
<script type="text/javascript">
function ftpDownload(ftpPath, dirName, displayName) {
var url = 'FTPDownload.aspx?ftpPath=' + ftpPath + '&dirName=' + dirName + '&displayName=' + escape(displayName);
window.open(url);
}
</script>
</head>
<body>
<form id="form1" runat="server">
<div>
<a href="javascript:void(0);" onclick="ftpDownload('ftp://172.20.171.74:21/MainPlan//1.txt','MainPlan','显示名称.txt');">ftp://172.20.171.74:21/MainPlan//1.txt</a>
</div>
</form>
</body>
</html>
下载页面
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using WebUtility;
namespace PlatForm
{
public partial class FTPDownload : System.Web.UI.Page
{
private string FtpServerIP = ConfigurationManager.AppSettings["FtpServerIP"];
private string FtpUserID = ConfigurationManager.AppSettings["FtpUserID"];
private string FtpPassword = ConfigurationManager.AppSettings["FtpPassword"];
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
string ftpPath = Request.QueryString["ftpPath"];
string dirName = Request.QueryString["dirName"];
string displayName = Request.QueryString["displayName"];
#region 下载
FTPHelper helper = new FTPHelper(FtpServerIP, dirName, FtpUserID, FtpPassword);
helper.Download(Request, Response, Server, displayName, ftpPath);
#endregion
}
}
}
}
FTPHelper
using System;
using System.Collections.Generic;
using System.Configuration;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Text.RegularExpressions;
namespace WebUtility
{
public class FTPHelper
{
private string FtpTempFile = ConfigurationManager.AppSettings["FtpTempFile"];
#region 字段
string ftpURI;
string ftpUserID;
string ftpServerIP;
string ftpPassword;
string ftpRemotePath;
#endregion
/// <summary>
/// 连接FTP服务器
/// </summary>
/// <param name="FtpServerIP">FTP连接地址</param>
/// <param name="FtpRemotePath">指定FTP连接成功后的当前目录, 如果不指定即默认为根目录</param>
/// <param name="FtpUserID">用户名</param>
/// <param name="FtpPassword">密码</param>
public FTPHelper(string FtpServerIP, string FtpRemotePath, string FtpUserID, string FtpPassword)
{
ftpServerIP = FtpServerIP;
ftpRemotePath = FtpRemotePath;
ftpUserID = FtpUserID;
ftpPassword = FtpPassword;
ftpURI = "ftp://" + ftpServerIP + "/" + ftpRemotePath + "/";
}
/// <summary>
/// 上传
/// </summary>
/// <param name="filename">上传文件路径</param>
/// <param name="ftpDir">ftp目录</param>
/// <returns>文件ftp路径</returns>
public string Upload(string filename, string ftpDir)
{
#region 创建目录并跳转到目录
this.MakeDir(ftpDir);
this.GotoDirectory(ftpDir, false);
#endregion
string ftpPath = string.Empty;
FileInfo fileInf = new FileInfo(filename);
FtpWebRequest reqFTP;
reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpURI + fileInf.Name));
reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
reqFTP.Method = WebRequestMethods.Ftp.UploadFile;
reqFTP.KeepAlive = false;
reqFTP.UseBinary = true;
reqFTP.ContentLength = fileInf.Length;
int buffLength = 2048;
byte[] buff = new byte[buffLength];
int contentLen;
FileStream fs = fileInf.OpenRead();
try
{
Stream strm = reqFTP.GetRequestStream();
contentLen = fs.Read(buff, 0, buffLength);
while (contentLen != 0)
{
strm.Write(buff, 0, contentLen);
contentLen = fs.Read(buff, 0, buffLength);
}
strm.Close();
fs.Close();
ftpPath = Path.Combine(ftpURI, Path.GetFileName(filename));
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
return ftpPath;
}
/// <summary>
/// 下载ftp文件
/// </summary>
/// <param name="Server"></param>
/// <param name="ftpPath">文件ftp路径</param>
/// <returns>返回下载文件路径</returns>
public string ftpDownload(System.Web.HttpServerUtility Server, string ftpPath)
{
string tempPath = string.Empty;
string tempFile = string.Empty;
FileStream outputStream = null;
try
{
string fileName = Path.GetFileName(ftpPath);
#region web服务器创建零时文件夹
string tempDir = Server.MapPath("~/" + FtpTempFile);
if (!Directory.Exists(tempDir))
Directory.CreateDirectory(tempDir);
#endregion
tempFile = Path.Combine(tempDir, fileName);
if (File.Exists(tempFile))
return tempFile;
outputStream = new FileStream(tempFile, FileMode.Create);
FtpWebRequest reqFTP;
reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpPath));
reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
reqFTP.Method = WebRequestMethods.Ftp.DownloadFile;
reqFTP.UseBinary = true;
FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
Stream ftpStream = response.GetResponseStream();
long cl = response.ContentLength;
int bufferSize = 2048;
int readCount;
byte[] buffer = new byte[bufferSize];
readCount = ftpStream.Read(buffer, 0, bufferSize);
while (readCount > 0)
{
outputStream.Write(buffer, 0, readCount);
readCount = ftpStream.Read(buffer, 0, bufferSize);
}
ftpStream.Close();
outputStream.Close();
response.Close();
tempPath = tempFile;
}
catch (Exception ex)
{
outputStream.Close();
File.Delete(tempFile);
//throw new Exception(ex.Message);
}
return tempPath;
}
/// <summary>
/// 删除文件
/// </summary>
public void Delete(string fileName)
{
try
{
FtpWebRequest reqFTP;
reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpURI + fileName));
reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
reqFTP.Method = WebRequestMethods.Ftp.DeleteFile;
reqFTP.KeepAlive = false;
string result = String.Empty;
FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
long size = response.ContentLength;
Stream datastream = response.GetResponseStream();
StreamReader sr = new StreamReader(datastream);
result = sr.ReadToEnd();
sr.Close();
datastream.Close();
response.Close();
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}
/// <summary>
/// 获取当前目录下明细(包含文件和文件夹)
/// </summary>
public string[] GetFilesDetailList()
{
try
{
StringBuilder result = new StringBuilder();
FtpWebRequest ftp;
ftp = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpURI));
ftp.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
ftp.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
WebResponse response = ftp.GetResponse();
StreamReader reader = new StreamReader(response.GetResponseStream());
string line = reader.ReadLine();
line = reader.ReadLine();
line = reader.ReadLine();
while (line != null)
{
result.Append(line);
result.Append("\n");
line = reader.ReadLine();
}
result.Remove(result.ToString().LastIndexOf("\n"), 1);
reader.Close();
response.Close();
return result.ToString().Split('\n');
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}
/// <summary>
/// 获取FTP文件列表(包括文件夹)
/// </summary>
private string[] GetAllList(string url)
{
List<string> list = new List<string>();
FtpWebRequest req = (FtpWebRequest)WebRequest.Create(new Uri(url));
req.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
req.Method = WebRequestMethods.Ftp.ListDirectory;
req.UseBinary = true;
req.UsePassive = true;
try
{
using (FtpWebResponse res = (FtpWebResponse)req.GetResponse())
{
using (StreamReader sr = new StreamReader(res.GetResponseStream()))
{
string s;
while ((s = sr.ReadLine()) != null)
{
list.Add(s);
}
}
}
}
catch (Exception ex)
{
throw (ex);
}
return list.ToArray();
}
/// <summary>
/// 获取当前目录下文件列表(不包括文件夹)
/// </summary>
public string[] GetFileList(string url)
{
StringBuilder result = new StringBuilder();
FtpWebRequest reqFTP;
try
{
reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(url));
reqFTP.UseBinary = true;
reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
reqFTP.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
WebResponse response = reqFTP.GetResponse();
StreamReader reader = new StreamReader(response.GetResponseStream());
string line = reader.ReadLine();
while (line != null)
{
if (line.IndexOf("<DIR>") == -1)
{
result.Append(Regex.Match(line, @"[\S]+ [\S]+", RegexOptions.IgnoreCase).Value.Split(' ')[1]);
result.Append("\n");
}
line = reader.ReadLine();
}
if (result.ToString().IndexOf('\n') != -1)
result.Remove(result.ToString().LastIndexOf('\n'), 1);
reader.Close();
response.Close();
}
catch (Exception ex)
{
throw (ex);
}
return result.ToString().Split('\n');
}
/// <summary>
/// 判断当前目录下指定的文件是否存在
/// </summary>
/// <param name="RemoteFileName">远程文件名</param>
public bool FileExist(string RemoteFileName)
{
string[] fileList = GetFileList(ftpURI);
foreach (string str in fileList)
{
if (str.Trim() == RemoteFileName.Trim())
{
return true;
}
}
return false;
}
/// <summary>
/// 创建文件夹
/// </summary>
public void MakeDir(string dirName)
{
FtpWebRequest reqFTP;
try
{
reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpURI + dirName));
reqFTP.Method = WebRequestMethods.Ftp.MakeDirectory;
reqFTP.UseBinary = true;
reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
Stream ftpStream = response.GetResponseStream();
ftpStream.Close();
response.Close();
}
catch (Exception ex)
{ }
}
/// <summary>
/// 获取指定文件大小
/// </summary>
public long GetFileSize(string filename)
{
FtpWebRequest reqFTP;
long fileSize = 0;
try
{
reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpURI + filename));
reqFTP.Method = WebRequestMethods.Ftp.GetFileSize;
reqFTP.UseBinary = true;
reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
Stream ftpStream = response.GetResponseStream();
fileSize = response.ContentLength;
ftpStream.Close();
response.Close();
}
catch (Exception ex)
{ }
return fileSize;
}
/// <summary>
/// 更改文件名
/// </summary>
public void ReName(string currentFilename, string newFilename)
{
FtpWebRequest reqFTP;
try
{
reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpURI + currentFilename));
reqFTP.Method = WebRequestMethods.Ftp.Rename;
reqFTP.RenameTo = newFilename;
reqFTP.UseBinary = true;
reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
Stream ftpStream = response.GetResponseStream();
ftpStream.Close();
response.Close();
}
catch (Exception ex)
{ }
}
/// <summary>
/// 移动文件
/// </summary>
public void MovieFile(string currentFilename, string newDirectory)
{
ReName(currentFilename, newDirectory);
}
/// <summary>
/// 切换当前目录
/// </summary>
/// <param name="IsRoot">true:绝对路径 false:相对路径</param>
public void GotoDirectory(string DirectoryName, bool IsRoot)
{
if (IsRoot)
{
ftpRemotePath = DirectoryName;
}
else
{
ftpRemotePath += DirectoryName + "/";
}
ftpURI = "ftp://" + ftpServerIP + "/" + ftpRemotePath + "/";
}
#region Web下载文件
/// <summary>
/// 抛出文件
/// </summary>
/// <param name="Request"></param>
/// <param name="Response"></param>
/// <param name="Server"></param>
/// <param name="DisplayName">文件显示名称</param>
/// <param name="ftpPath">文件ftp路径</param>
public void Download(System.Web.HttpRequest Request, System.Web.HttpResponse Response, System.Web.HttpServerUtility Server, string DisplayName, string ftpPath)
{
//下载ftp文件
string path = this.ftpDownload(Server, ftpPath);
if (!string.IsNullOrEmpty(path))
{
string fileName = Path.GetFileName(path);
if (File.Exists(path))
{
if (Request.UserAgent.ToLower().IndexOf("msie") > -1)
{
fileName = ToHexString(fileName);
}
System.IO.FileInfo file = new System.IO.FileInfo(path);
Response.Clear();
// Response.AddHeader("Content-Disposition", "attachment; filename=" + fileName);//设置读取的文件头 使用file.Name 会造成中文名乱码
if (Request.UserAgent.ToLower().IndexOf("firefox") > -1)
{
//为了向客户端输出空格,需要在当客户端使用 Firefox 时特殊处理
Response.AddHeader("Content-Disposition", "attachment;filename=\"" + ToHexString(DisplayName) + "\"");
}
else
{
Response.AddHeader("Content-Disposition", "attachment;filename=" + ToHexString(DisplayName));
}
Response.AddHeader("Content-Length", file.Length.ToString());
Response.ContentType = "application/octet-stream";//设置输出类型 这里可以保存在数据库中 动态实现类型
Response.WriteFile(file.FullName);//输出
Response.End();
}
else
{
Response.Write("文件不存在");
Response.End();
}
}
else
{
Response.Write("文件不存在");
Response.End();
}
}
/// <summary>
/// 为字符串中的非英文字符编码
/// </summary>
/// <param name="s"></param>
/// <returns></returns>
private string ToHexString(string s)
{
char[] chars = s.ToCharArray();
StringBuilder builder = new StringBuilder();
for (int index = 0; index < chars.Length; index++)
{
bool needToEncode = NeedToEncode(chars[index]);
if (needToEncode)
{
string encodedString = ToHexString(chars[index]);
builder.Append(encodedString);
}
else
{
builder.Append(chars[index]);
}
}
return builder.ToString();
}
/// <summary>
///指定 一个字符是否应该被编码
/// </summary>
/// <param name="chr"></param>
/// <returns></returns>
private bool NeedToEncode(char chr)
{
string reservedChars = "$-_.+!*'(),@=&";
if (chr > 127)
return true;
if (char.IsLetterOrDigit(chr) || reservedChars.IndexOf(chr) >= 0)
return false;
return true;
}
/// <summary>
/// 为非英文字符串编码
/// </summary>
/// <param name="chr"></param>
/// <returns></returns>
private string ToHexString(char chr)
{
UTF8Encoding utf8 = new UTF8Encoding();
byte[] encodedBytes = utf8.GetBytes(chr.ToString());
StringBuilder builder = new StringBuilder();
for (int index = 0; index < encodedBytes.Length; index++)
{
builder.AppendFormat("%{0}", Convert.ToString(encodedBytes[index], 16));
}
return builder.ToString();
}
#endregion
}
}