网站首页 博客 C#使用FTP方式上传文件
C#使用FTP方式上传文件
 2017-12-11 14:01:41  管理员  442

需要用到的命名空间:

using System.IO;
using System.Net;

FTP上传类定义:

public class FtpHelper
{
    /// <summary>
    /// 上传文件
    /// </summary>
    /// <param name="fileinfo">需要上传的文件</param>
    /// <param name="targetDir">目标路径</param>
    /// <param name="hostname">ftp地址</param>
    /// <param name="username">ftp用户名</param>
    /// <param name="password">ftp密码</param>
    public static void UploadFile(FileInfo fileinfo, string targetDir, string hostname, string username, string password, string filename)
    {
        if (targetDir.Trim() == "" || filename.Trim() == "")
        {
            return;
        }

        string URI = "ftp://" + hostname + "/" + targetDir + "/" + filename;
        CreateRemoteDir(hostname, username, password, targetDir);
        //检查是否有同名文件,如有则删除
        bool sameexist = RemoteFileExists(hostname, username, password, targetDir + "/" + filename);
        if (sameexist)
        {
            d.e.l.e.t.eRemoteFile(hostname, username, password, targetDir + "/" + filename);
        }
        System.Net.FtpWebRequest ftp = GetRequest(URI, username, password);
        //设置FTP命令 设置所要执行的FTP命令,
        //ftp.Method = System.Net.WebRequestMethods.Ftp.ListDirectoryDetails;//假设此处为显示指定路径下的文件列表
        ftp.Method = System.Net.WebRequestMethods.Ftp.UploadFile;
        //指定文件传输的数据类型
        ftp.UseBinary = true;
        ftp.UsePassive = true;

        //告诉ftp文件大小
        ftp.ContentLength = fileinfo.Length;
        //缓冲大小设置为2KB
        const int BufferSize = 2048;
        byte[] content = new byte[BufferSize - 1 + 1];
        int dataRead;

        //打开一个文件流 (System.IO.FileStream) 去读上传的文件
        using (FileStream fs = fileinfo.OpenRead())
        {
            try
            {
                //把上传的文件写入流
                using (Stream rs = ftp.GetRequestStream())
                {
                    do
                    {
                        //每次读文件流的2KB
                        dataRead = fs.Read(content, 0, BufferSize);
                        rs.Write(content, 0, dataRead);
                    } while (!(dataRead < BufferSize));
                    rs.Close();
                }

            }
            catch (Exception ex) 
            {
                //string errorinfo = ex.Message;
            }
            finally
            {
                fs.Close();
            }

        }
        ftp = null;
    }

    //创建ftp连接
    private static FtpWebRequest GetRequest(string URI, string username, string password)
    {
        //根据服务器信息FtpWebRequest创建类的对象
        FtpWebRequest result = (FtpWebRequest)FtpWebRequest.Create(URI);
        //提供身份验证信息
        result.Credentials = new System.Net.NetworkCredential(username, password);
        //设置请求完成之后是否保持到FTP服务器的控制连接,默认值为true
        result.KeepAlive = false;
        return result;
    }

    //在ftp服务器上创建目录
    public static bool CreateRemoteDir(string hostname, string username, string password, string dirName)
    {
        try
        {
            bool b = RemoteDirExists(hostname, username, password, dirName);
            if (b)
            {
                return true;
            }
            string url = "ftp://" + hostname + "/" + dirName;
            FtpWebRequest reqFtp = (FtpWebRequest)FtpWebRequest.Create(new Uri(url));
            reqFtp.UseBinary = true;
            // reqFtp.KeepAlive = false;
            reqFtp.Method = WebRequestMethods.Ftp.MakeDirectory;
            reqFtp.Credentials = new NetworkCredential(username, password);
            FtpWebResponse response = (FtpWebResponse)reqFtp.GetResponse();
            response.Close();
            return true;
        }
        catch (Exception ex)
        {
            //string errorinfo = ex.Message;
            return false;
        }

    }

    //判断ftp上的目录是否存在
    public static bool RemoteDirExists(string hostname, string username, string password, string path)
    {
        path = "ftp://" + hostname + "/" +path;
        FtpWebRequest reqFtp = (FtpWebRequest)FtpWebRequest.Create(new Uri(path));
        reqFtp.UseBinary = true;
        reqFtp.Credentials = new NetworkCredential(username, password);
        reqFtp.Method = WebRequestMethods.Ftp.ListDirectory;
        FtpWebResponse resFtp = null;
        try
        {
            resFtp = (FtpWebResponse)reqFtp.GetResponse();
            FtpStatusCode code = resFtp.StatusCode;//OpeningData
            resFtp.Close();
            return true;
        }
        catch
        {
            if (resFtp != null)
            {
                resFtp.Close();
            }
            return false;
        }
    }

    //判断ftp上的文件是否存在
    public static bool RemoteFileExists(string hostname, string username, string password, string filepath)
    {
        bool result = true;
        FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://" + hostname + "/" + filepath);
        request.Credentials = new NetworkCredential(username, password);
        request.Method = WebRequestMethods.Ftp.GetFileSize;
        try
        {
            FtpWebResponse response = (FtpWebResponse)request.GetResponse();
        }
        catch (WebException ex)
        {
            FtpWebResponse response = (FtpWebResponse)ex.Response;
            if (response.StatusCode == FtpStatusCode.ActionNotTakenFileUnavailable)
            {
                result = false; //文件不存在
            }
        }
        request = null;
        return result;
    }

    //删除ftp上的文件
    public static bool d.e.l.e.t.eRemoteFile(string hostname, string username, string password, string filepath)
    {
        FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://" + hostname + "/" + filepath);
        request.Credentials = new NetworkCredential(username, password);
        request.Method = WebRequestMethods.Ftp.d.e.l.e.t.eFile;
        FtpWebResponse response = (FtpWebResponse)request.GetResponse();
        bool result = response.StatusCode == FtpStatusCode.CommandOK || response.StatusCode == FtpStatusCode.FileActionOK;
        response.Close();
        request = null;
        return result;
    }

}

上传文件用法:

string ftpserver = "192.168.1.250"; //FTP服务器
int ftpport = 2121; //FTP端口号
string ftpuser = "hello"; //FTP用户名
string ftppass = "world"; //FTP密码
string year = DateTime.Now.Year.ToString();
string month = DateTime.Now.Month.ToString();
string day = DateTime.Now.Day.ToString();
string savepath = year + month + "/" + day; //FTP保存路径
string savename = "test_save.png"; //FTP保存文件名
FileInfo fileinfo = new FileInfo("D:\\test.png");
FtpHelper.UploadFile(fileinfo, savepath, ftpserver + ":" + ftpport, ftpuser, ftppass, savename);


来说两句吧
最新评论