public class FtpHelper
{
public FtpHelper(string p_url, string p_user, string p_password)
{
if (!p_url.ToUpper().StartsWith("FTP:"))
{
Url = "ftp://" + p_url;
}
else
{
Url = p_url;
}
User = p_user;
Password = p_password;
} public string Url { get; private set; } public string User { get; private set; } public string Password { get; private set; } public FtpWebRequest CreateConnect(string p_uri)
{
FtpWebRequest reqFTP; // 根据uri创建FtpWebRequest对象
reqFTP = (FtpWebRequest)WebRequest.Create(new Uri(p_uri)); // ftp用户名和密码
reqFTP.Credentials = new NetworkCredential(User, Password); return reqFTP;
} /// <summary>
/// 上传文件
/// </summary>
/// <param name="p_uri">ftp地址 ex=ftp://192.168.100.5//tmp// 切记要以//结尾</param>
/// <param name="p_filename">文件路径地址绝对路径 ex:C:\\Users\ligl\\Desktop\\1.txt</param>
/// <param name="isDelete"></param>
/// <returns></returns>
public bool Upload(string p_uri, string p_filename, bool isDelete = false)
{
var fileInf = new FileInfo(p_filename);
string uri = Path.Combine(p_uri, fileInf.Name); FtpWebRequest reqFTP = CreateConnect(uri);
// 默认为true,连接不会被关闭
// 在一个命令之后被执行
reqFTP.KeepAlive = false; // 指定执行什么命令
reqFTP.Method = WebRequestMethods.Ftp.UploadFile; // 指定数据传输类型
reqFTP.UseBinary = true; // 上传文件时通知服务器文件的大小
reqFTP.ContentLength = fileInf.Length + ; // 缓冲大小设置为2kb
int buffLength = ; var buff = new byte[buffLength];
int contentLen; // 打开一个文件流 (System.IO.FileStream) 去读上传的文件
FileStream fs = fileInf.OpenRead();
try
{
// 把上传的文件写入流
Stream strm = reqFTP.GetRequestStream(); // 每次读文件流的2kb
contentLen = fs.Read(buff, , buffLength); // 流内容没有结束
while (contentLen != )
{
// 把内容从file stream 写入 upload stream
strm.Write(buff, , contentLen); contentLen = fs.Read(buff, , buffLength);
} // 关闭两个流
strm.Close();
fs.Close(); var uploadResponse = (FtpWebResponse)reqFTP.GetResponse();
if (File.Exists(p_filename) && isDelete)
{
File.Delete(p_filename);
}
return (uploadResponse.StatusDescription.StartsWith(""));
}
catch (Exception ex)
{
//System.Windows.MessageBox.Show(ex.Message, "Upload Error");
throw ex;
}
} public bool Delete(string p_filename)
{
var fileInf = new FileInfo(p_filename);
string uri = Path.Combine(Url, fileInf.Name); try
{
var listRequest = (FtpWebRequest)WebRequest.Create(new Uri(uri)); listRequest.Method = WebRequestMethods.Ftp.DeleteFile; listRequest.Credentials = new NetworkCredential(User, Password); var listResponse = (FtpWebResponse)listRequest.GetResponse(); return (listResponse.StatusDescription.StartsWith(""));
}
catch (Exception ex)
{
throw ex;
}
} public bool MakeDir(string p_uri)
{
try
{
string url = Url;
if (string.IsNullOrEmpty(url))
{
return false;
} char lastChar = url[url.Length - ];
if (lastChar != '\\' && lastChar != '/')
{
url += '\\';
} string dir = p_uri.Remove(, url.Length); string[] dirs = dir.Split(new[] { Path.AltDirectorySeparatorChar, Path.DirectorySeparatorChar },
StringSplitOptions.RemoveEmptyEntries); dir = CreateDir(dirs); return CreateMackDir(url, dir);
}
catch (Exception ex)
{
throw ex;
}
} public string CreateDir(string[] p_dirNames)
{
var sb = new StringBuilder(); foreach (string dir in p_dirNames)
{
sb.Append(dir);
sb.Append("\\");
} return sb.ToString();
} public string GetFirstDir(string p_dir)
{
string[] dirs = p_dir.Split(new[] { Path.AltDirectorySeparatorChar, Path.DirectorySeparatorChar },
StringSplitOptions.RemoveEmptyEntries); if (dirs.Length > )
{
return dirs[];
} return string.Empty;
} public string RemvoeDirFromFirst(string p_longDir, string p_firstDir)
{
string value = p_longDir.Remove(, p_firstDir.Length + ); return value;
} private bool CreateMackDir(string p_url, string p_dir)
{
string dir = GetFirstDir(p_dir); if (string.IsNullOrEmpty(dir))
{
return true;
} string newurl = Path.Combine(p_url, dir);
if (!IsExsit(p_url, dir))
{
try
{
FtpWebRequest reqFtp = CreateConnect(newurl);
reqFtp.Method = WebRequestMethods.Ftp.MakeDirectory;
var response = (FtpWebResponse)reqFtp.GetResponse();
response.Close();
}
catch (Exception ex)
{
throw ex;
}
} string newdir = RemvoeDirFromFirst(p_dir, dir);
CreateMackDir(newurl, newdir); return true;
} public bool IsExsit(string p_url, string p_dir)
{
string[] list = GetFileList(p_url, WebRequestMethods.Ftp.ListDirectory); if (list == null || list.Length == )
{
return false;
} return list.Contains(p_dir);
} private string[] GetFileList(string path, string WRMethods) //上面的代码示例了如何从ftp服务器上获得文件列表
{
var result = new StringBuilder(); try
{
string tempPath = path;
if (!path.EndsWith("/"))
{
tempPath += "/";
} FtpWebRequest reqFtp = CreateConnect(tempPath);
reqFtp.Method = WRMethods;
WebResponse response = reqFtp.GetResponse();
var reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8); //中文文件名
string line = reader.ReadLine();
while (line != null)
{
result.Append(line);
result.Append("\n");
line = reader.ReadLine();
}
// to remove the trailing '/n'
if (result.Length > )
{
result.Remove(result.ToString().LastIndexOf('\n'), );
}
reader.Close();
response.Close();
return result.ToString().Split('\n');
}
catch (Exception ex)
{
throw ex;
}
}
}

C# FTP上传的更多相关文章

  1. .net FTP上传文件

    FTP上传文件代码实现: private void UploadFileByWebClient() { WebClient webClient = new WebClient(); webClient ...

  2. 通过cmd完成FTP上传文件操作

    一直使用 FileZilla 这个工具进行相关的 FTP 操作,而在某一次版本升级之后,发现不太好用了,连接老是掉,再后来完全连接不上去. 改用了一段时间的 Web 版的 FTP 工具,后来那个页面也 ...

  3. FTP上传文件到服务器

    一.初始化上传控件. 1.我们这里用dropzone.js作为上传控件,下载地址http://www.dropzonejs.com/ 2.这里我们使用一个div元素作为dropzone载体. < ...

  4. 再看ftp上传文件

    前言 去年在项目中用到ftp上传文件,用FtpWebRequest和FtpWebResponse封装一个帮助类,这个在网上能找到很多,前台使用Uploadify控件,然后在服务器上搭建Ftp服务器,在 ...

  5. 【完整靠谱版】结合公司项目,仔细总结自己使用百度编辑器实现FTP上传的完整过程

    说在前面 工作中会遇到很多需要使用富文本编辑器的地方,比如我现在发布这篇文章离不开这个神器,而且现在网上编辑器太多了.记得之前,由于工作需要自己封装过一个编辑器的公共插件,是用ckeditor改版的, ...

  6. FTP上传文件提示550错误原因分析。

    今天测试FTP上传文件功能,同样的代码从自己的Demo移到正式的代码中,不能实现功能,并报 Stream rs = ftp.GetRequestStream()提示远程服务器返回错误: (550) 文 ...

  7. JAVA 实现FTP上传下载(sun.net.ftp.FtpClient)

    package com.why.ftp; import java.io.DataInputStream; import java.io.File; import java.io.FileInputSt ...

  8. FTP上传-封装工具类

    import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import ja ...

  9. 记一次FTP上传文件总是超时的解决过程

    好久没写博,还是重拾记录一下吧. 背景:买了一个阿里云的云虚拟机用来搭建网站(起初不了解云虚拟主机和云服务器的区别,以为都是有SSH功能的,后来发现不是这样样子啊,云虚拟机就是FTP上传网页+MySQ ...

  10. FlashFXP(强大的FXP/ftp上传工具)V5.0.0.3722简体中文特别版

    flashfxp是功能强大的fxp/ftp软件,融合了一些其他优秀ftp软件的优点,如像cuteftp一样可以比较文件夹, FlashFXP是一款功能强大的FXP/ftp上传工具, FlashFXP集 ...

随机推荐

  1. Oracle BIEE启停脚本

    作为BI的开发人员,经常启停BI服务在所难免,启动的过程又比较长,命令需要不同目录切换,简直烦死人呢, 特意整理了linux中的启动脚本,将以下脚本存成biee.sh,后面的过程就相当简单了, 启动: ...

  2. spring mvc CommonsMultipartResolver上传文件异常处理

    近期已经上线的项目出现了一个异常 严重: Servlet.service() for servlet JeeCmsAdmin threw exception org.apache.commons.fi ...

  3. Chrome浏览器二维码生成插件

      猛击就可以使用啦->>>猛击使用   源码如下: 源码打包   源码: jquery-2.1.3.min.js jquery.qrcode.min.js https://gith ...

  4. Remote Desktop File Format

    转自:http://engrmosaic.uncc.edu/mosaic-anywhere/remote-desktop-file-format The new Terminal Services c ...

  5. srping MVC 工程简单搭建

    Spring版本:3.2.2.RELEASE 第一步:导入必须的jar包 spring-beans.jar spring-context.jar spring-core.jar spring-expr ...

  6. x01.os.13: 文件系统

    停了两天电,忽然得空闲.找来破吉他,已然不成弦.           丁丁当当敲,敲到电来到.为把时间捡,熬夜三四点. 从我的置顶随笔 x01.Lab.Download 中下载 x01.os.12.t ...

  7. 二:Go编程语言规范-类型

    1.类型 布尔值,数值与字符串类型的实例的命名是预声明的. 数组,结构,指针,函数,接口,切片,映射和信道这些复合类型可由类型字面构造. 每个类型 T 都有一个 基本类型:若 T 为预声明类型或类型字 ...

  8. [PHP]swoole_server几个进程的分工

    readme.md-/Users/zjh/Documents/我的文章/[PHP]swoole_server几个进程的分工 html{font-family: sans-serif;-ms-text- ...

  9. UVa10820 Send a Table[欧拉函数]

    Send a TableInput: Standard Input Output: Standard Output When participating in programming contests ...

  10. 网络之Ip地址

    0.0.0.0---255.255.255.255 Ip地址分类(D.E)不对外开放 网络类别 最大网络数 IP地址范围(,唯一的,花钱的) 最大主机数 私有IP地址范围 (做内网ip,不可直接访问公 ...