转载自:https://www.cnblogs.com/zhzhx/archive/2013/05/08/3065973.html (若侵权请联系我删除)
ASP.NET中,有时候会遇到把文件上传到ftp或者从ftp上下载文件的操作,下文针对这些操作一一展开。
首先,引用命名空间。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Text;
using System.Net;
using System.Data;
using System.IO;
using System.ComponentModel;
其中,前四个是新建ASP.NET时自动添加的,后五个为手动添加。
然后,在class1类中(假设新添加的类为class1)声明全局变量,即ftp登陆所需的用户名和密码。
1 private string ftpUser = "username"; //ftp用户名
2 private string ftpPassword = "12345"; //ftp密码
接着就是上传、下载、重命名、删除和检查存在的方法了。
1.上传文件到ftp
上传的方法代码如下:
/// <summary>
/// 上传文件
/// </summary>
/// <param name="localFile1">本地文件路径及文件名</param>
/// <param name="ftpFileName">ftp文件路径及文件名(文件名可重命名)</param>
/// <returns>返回bool值</returns>
public bool fileUpload(string localFile1, string ftpFileName)
{
FileInfo localFile = new FileInfo(localFile1);
bool success = false;
FtpWebRequest ftpWebRequest = null;
FileStream localFileStream = null;
Stream requestStream = null;
try
{
string uri = ftpFileName;
ftpWebRequest = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri));
ftpWebRequest.Credentials = new NetworkCredential(ftpUser, ftpPassword);
ftpWebRequest.UseBinary = true;//指定数据传输类型为二进制
ftpWebRequest.KeepAlive = false;//成功执行一个命令后连接被关闭
ftpWebRequest.Method = WebRequestMethods.Ftp.UploadFile;// 指定执行什么命令
ftpWebRequest.ContentLength = localFile.Length;//上传文件时通知服务器文件的大小
int buffLength = 20480;// 缓冲大小设置为20kb
byte[] buff = new byte[buffLength];
int contentLen;
localFileStream = localFile.OpenRead();//打开一个文件流去读上传的文件
requestStream = ftpWebRequest.GetRequestStream();//把上传的文件写入流
contentLen = localFileStream.Read(buff, 0, buffLength);//每次读文件流的2kb
while (contentLen != 0)// 流内容没有结束
{
// 把内容从file stream 写入 upload stream
requestStream.Write(buff, 0, contentLen);
contentLen = localFileStream.Read(buff, 0, buffLength);
}
success = true;
}
catch (Exception)
{
success = false;
}
finally
{
if (requestStream != null)
{
requestStream.Close();
}
if (localFileStream != null)
{
localFileStream.Close();
}
}
return success;
}
调用方法为实例化类对象,然后通过类对象直接调用。
示例:假设该方法包含在class1类中(以下方法均假设包含在class1中),则有:
1 class1 ftpClient1 = new class1(); //实例化类FTPClient
2 ftpClient1.fileUpload("D:\\456.png", "ftp://192.18.13.11/123.png"); //上传文件
另一种方法支持断点续传的方法如下:
添加命名空间:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.IO;
using System.Net;
using System.Net.Security;
using System.Collections;
using System.Security.Cryptography.X509Certificates;
using System.Web.Configuration;
class1类中的代码如下:
public class class1
{
private NetworkCredential certificate;
/// <summary>
/// 构造函数,提供初始化数据的功能,打开Ftp站点
/// </summary>
public class1()
{
certificate = new NetworkCredential("administrator", "cnugis202");
}
/// <summary>
/// 创建FTP请求
/// </summary>
/// <param name="uri">ftp://myserver/upload.txt</param>
/// <param name="method">Upload/Download</param>
/// <returns></returns>
private FtpWebRequest CreateFtpWebRequest(Uri uri, string method)
{
FtpWebRequest ftpClientRequest = (FtpWebRequest)WebRequest.Create(uri);
ftpClientRequest.Proxy = null;
ftpClientRequest.Credentials = certificate;
ftpClientRequest.KeepAlive = true;
ftpClientRequest.UseBinary = true;
ftpClientRequest.UsePassive = true;
ftpClientRequest.Method = method;
//ftpClientRequest.Timeout = -1;
return ftpClientRequest;
}
//支持断点续传
public bool UploadFile(string sourceFile, Uri destinationPath, int offSet, string ftpMethod)
{
try
{
FileInfo file = new FileInfo(sourceFile);
Uri uri = new Uri(destinationPath.AbsoluteUri + "/" + file.Name);
FtpWebRequest request = CreateFtpWebRequest(uri, ftpMethod);
request.ContentOffset = offSet;
Stream requestStream = request.GetRequestStream();//需要获取文件的流
FileStream fileStream = new FileStream(sourceFile, FileMode.Open, FileAccess.Read);//创建存储文件的流
int sourceLength = (int)fileStream.Length;
offSet = CopyDataToDestination(fileStream, requestStream, offSet);
WebResponse response = request.GetResponse();
response.Close();
if (offSet != 0)
{
UploadFile(sourceFile, destinationPath, offSet, WebRequestMethods.Ftp.AppendFile);
}
}
catch (Exception ex)
{
ex.ToString();
return false;
}
return true;
}
private int CopyDataToDestination(Stream sourceStream, Stream destinationStream, int offSet)
{
try
{
int sourceLength = (int)sourceStream.Length;
int length = sourceLength - offSet;
byte[] buffer = new byte[length + offSet];
int bytesRead = sourceStream.Read(buffer, offSet, length);
while (bytesRead != 0)
{
destinationStream.Write(buffer, 0, bytesRead);
bytesRead = sourceStream.Read(buffer, 0, length);
length = length - bytesRead;
offSet = (bytesRead == 0) ? 0 : (sourceLength - length);//(length - bytesRead);
}
}
catch (Exception ex)
{
string error = ex.ToString();
return offSet;
}
finally
{
destinationStream.Close();
sourceStream.Close();
}
return offSet;
}
}
调用方法为:
1 class1 ftpClientService = new class1(); //实例化class1类对象
2 ftpClientService.UploadFile("D:\\456.png", new Uri("ftp://192.18.13.11/123.png“), 0, WebRequestMethods.Ftp.UploadFile);//调用class1类的UploadFile方法上传
2.从ftp下载文件
下载的方法代码如下:
/// <summary>
/// 下载文件
/// </summary>
/// <param name="localFileName">下载的ftp的文件路径及文件名</param>
/// <param name="ftpFileName">本地文件路径及文件名(文件名可重命名)</param>
/// <returns>返回值</returns>
public bool fileDownload(string ftpFileName, string localFileName)
{
bool success = false;
FtpWebRequest ftpWebRequest = null;
FtpWebResponse ftpWebResponse = null;
Stream ftpResponseStream = null;
FileStream outputStream = null;
try
{
outputStream = new FileStream(localFileName, FileMode.Create);
string uri = ftpFileName;
ftpWebRequest = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri));
ftpWebRequest.Credentials = new NetworkCredential(ftpUser, ftpPassword);
ftpWebRequest.UseBinary = true;
ftpWebRequest.Method = WebRequestMethods.Ftp.DownloadFile;
ftpWebResponse = (FtpWebResponse)ftpWebRequest.GetResponse();
ftpResponseStream = ftpWebResponse.GetResponseStream();
long contentLength = ftpWebResponse.ContentLength;
int bufferSize = 20480;
byte[] buffer = new byte[bufferSize];
int readCount;
readCount = ftpResponseStream.Read(buffer, 0, bufferSize);
while (readCount > 0)
{
outputStream.Write(buffer, 0, readCount);
readCount = ftpResponseStream.Read(buffer, 0, bufferSize);
}
success = true;
}
catch (Exception)
{
success = false;
}
finally
{
if (outputStream != null)
{
outputStream.Close();
}
if (ftpResponseStream != null)
{
ftpResponseStream.Close();
}
if (ftpWebResponse != null)
{
ftpWebResponse.Close();
}
}
return success;
}
调用方法为:
1 class1 ftpClient2 = new class1(); //实例化类FTPClient
2 ftpClient2.fileDownload(ftp://192.18.13.11/123.png","D:\\123.png); //下载文件
3.在ftp上重命名文件
对ftp文件的重命名,方法代码如下:
/// <summary>
/// 重命名
/// </summary>
/// <param name="ftpPath">ftp文件路径(不包含文件名)</param>
/// <param name="currentFilename">ftp文件的当前文件名</param>
/// <param name="newFilename">ftp文件的重命名后的新文件名</param>
/// <returns>返回值</returns>
public bool fileRename(string ftpPath, string currentFileName, string newFileName)
{
bool success = false;
FtpWebRequest ftpWebRequest = null;
FtpWebResponse ftpWebResponse = null;
Stream ftpResponseStream = null;
try
{
string uri = ftpPath + currentFileName;
ftpWebRequest = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri));
ftpWebRequest.Credentials = new NetworkCredential(ftpUser, ftpPassword);
ftpWebRequest.UseBinary = true;
ftpWebRequest.Method = WebRequestMethods.Ftp.Rename;
ftpWebRequest.RenameTo = newFileName;
ftpWebResponse = (FtpWebResponse)ftpWebRequest.GetResponse();
ftpResponseStream = ftpWebResponse.GetResponseStream();
}
catch (Exception)
{
success = false;
}
finally
{
if (ftpResponseStream != null)
{
ftpResponseStream.Close();
}
if (ftpWebResponse != null)
{
ftpWebResponse.Close();
}
}
return success;
}
调用方法为:
1 class1 ftpClient3 = new class1(); //实例化类对象
2 ftpClient3.fileRename(ftp://192.18.13.11/, "123.png", "456.png"); //ftp上重命名文件
4.删除ftp上的文件
删除ftp上文件的方法代码为:
/// <summary>
/// 删除文件
/// </summary>
/// <param name="ftpPath">ftp文件路径(不包含文件名)</param>
/// <param name="ftpName">文件名</param>
/// <returns>返回值</returns>
public bool fileDelete(string ftpPath, string ftpName)
{
bool success = false;
FtpWebRequest ftpWebRequest = null;
FtpWebResponse ftpWebResponse = null;
Stream ftpResponseStream = null;
StreamReader streamReader = null;
try
{
string uri = ftpPath + ftpName;
ftpWebRequest = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri));
ftpWebRequest.Credentials = new NetworkCredential(ftpUser, ftpPassword);
ftpWebRequest.KeepAlive = false;
ftpWebRequest.Method = WebRequestMethods.Ftp.DeleteFile;
ftpWebResponse = (FtpWebResponse)ftpWebRequest.GetResponse();
long size = ftpWebResponse.ContentLength;
ftpResponseStream = ftpWebResponse.GetResponseStream();
streamReader = new StreamReader(ftpResponseStream);
string result = String.Empty;
result = streamReader.ReadToEnd();
success = true;
}
catch (Exception)
{
success = false;
}
finally
{
if (streamReader != null)
{
streamReader.Close();
}
if (ftpResponseStream != null)
{
ftpResponseStream.Close();
}
if (ftpWebResponse != null)
{
ftpWebResponse.Close();
}
}
return success;
}
调用方法:
1 class1 ftpClient4 = new class1(); //实例化类对象
2 ftpClient4.fileDelete(ftp://192.18.13.11/, "456.png"); //删除ftp文件
5.检查ftp上某文件是否存在
/// <summary>
/// 检查文件是否存在
/// </summary>
/// <param name="ftpPath"></param>
/// <param name="ftpName"></param>
/// <returns></returns>
public bool fileCheckExist(string ftpPath, string ftpName)
{
bool success = false;
FtpWebRequest ftpWebRequest = null;
WebResponse webResponse = null;
StreamReader reader = null;
try
{
string url = ftpPath;
ftpWebRequest = (FtpWebRequest)FtpWebRequest.Create(new Uri(url));
ftpWebRequest.Credentials = new NetworkCredential(ftpUser, ftpPassword);
ftpWebRequest.Method = WebRequestMethods.Ftp.ListDirectory;
ftpWebRequest.KeepAlive = false;
webResponse = ftpWebRequest.GetResponse();
reader = new StreamReader(webResponse.GetResponseStream());
string line = reader.ReadLine();
while (line != null)
{
if (line == ftpName)
{
success = true;
break;
}
line = reader.ReadLine();
}
}
catch (Exception)
{
success = false;
}
finally
{
if (reader != null)
{
reader.Close();
}
if (webResponse != null)
{
webResponse.Close();
}
}
return success;
}
调用方法为:
class1 ftpClient5 = new class1(); //实例化类对象
bool flag = ftpClient5.fileCheckExist(ftp://192.18.13.11/, "123.png"); //检查文件是否存在
if (flag == true)
{
this.Response.Write("<script>alert('文件存在!')</script>");
}
else
{
this.Response.Write("<script>alert('文件不存在!')</script>");
}