关于本文档的说明

  本文档使用Socket通信方式来实现ftp文件的上传下载等命令的执行

  欢迎传播分享,必须保持原作者的信息,但禁止将该文档直接用于商业盈利。

  本人自从几年前走上编程之路,一直致力于收集和总结出好用的框架和通用类库,不管是微软自己的还是第三方的只要实际项目中好用且可以解决实际问题那都会收集好,编写好文章和别人一起分享,这样自己学到了,别人也能学到知识,当今社会很需要知识的搬运工。

Email:707055073@qq.com

  本文章地址:http://www.cnblogs.com/wohexiaocai/p/5475506.html

1.基本介绍

由于最近的项目是客户端的程序,需要将客户端的图片文件【切图】-【打包】-【ftp上传】,现在就差最后一步了,慢慢的把这些小功能实现了,合并到一起就是一个大功能了,所以一个业务需要拆分的很小很小才可以看清楚,这个项目实际需要用到哪些知识点,下面介绍一下ftp上传的命令

  ftp命令的参考链接:http://jingyan.baidu.com/article/b2c186c8ee1116c46ef6ffc8.html,这是我参考的百度,不全的地方还请大家留言告诉我一下。

  1. ftp适合小文件上传
  2. 对带宽要求要求较高
  3. 服务器安全性也要考虑到
  4. 命令需要熟悉,不然比较难

2.实际项目

  1. 文件上传
  2. 文件下载
  3. 删除文件
  4. 创建文件夹
  5. 文件夹重命名
  6. 删除文件夹
  7. 改变目录
  8. 获取文件夹中文件列表
  9. 等等

2.1 图片上传和下载

写了几个方法,一般用的最多的就是Put,具体的可以下载复制源码下来进行实战一下。

2.2 目录创建和删除

这个方法今天刚好用上了,折腾了一会,才搞定的。

3.调用代码参考

由于这个帮助类不是静态的,所以需要实例化

string userName = "xxx";
string password = "xxx";
var ftp = new FTPClientHelper("xxx", ".", userName, password, );

下面还是调用常用的方法,就可以了,因为账号、密码、服务器的IP地址都被我用“xxx”代替了,所以大家自己改下,还有ftp默认端口号是:21,如果有变动还是需要自己改下的。

4.FTPClientHelper下载

 //-------------------------------------------------------------------------------------
// All Rights Reserved , Copyright (C) 2015 , ZTO , Ltd .
//------------------------------------------------------------------------------------- using System;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading; namespace ZTO.PicTest.Utilities
{
/// <summary>
/// FTP操作帮助类
///
/// 修改纪录
///
/// 2016-4-4 版本:1.0 YangHengLian 创建主键,注意命名空间的排序,测试非常好。
///
/// 版本:1.0
///
/// <author>
/// <name>YangHengLian</name>
/// <date>2016-4-4</date>
/// </author>
/// </summary>
public class FTPClientHelper
{
public static object Obj = new object(); #region 构造函数
/// <summary>
/// 缺省构造函数
/// </summary>
public FTPClientHelper()
{
RemoteHost = "";
_strRemotePath = "";
_strRemoteUser = "";
_strRemotePass = "";
_strRemotePort = ;
_bConnected = false;
} /// <summary>
/// 构造函数
/// </summary>
public FTPClientHelper(string remoteHost, string remotePath, string remoteUser, string remotePass, int remotePort)
{
// Ip地址
RemoteHost = remoteHost;
// 这个很重要,表示连接路径,如果是.表示根目录
_strRemotePath = remotePath;
// 登录账号
_strRemoteUser = remoteUser;
// 登录密码
_strRemotePass = remotePass;
// ftp端口号
_strRemotePort = remotePort; Connect();
}
#endregion #region 字段
private int _strRemotePort;
private Boolean _bConnected;
private string _strRemotePass;
private string _strRemoteUser;
private string _strRemotePath; /// <summary>
/// 服务器返回的应答信息(包含应答码)
/// </summary>
private string _strMsg;
/// <summary>
/// 服务器返回的应答信息(包含应答码)
/// </summary>
private string _strReply;
/// <summary>
/// 服务器返回的应答码
/// </summary>
private int _iReplyCode;
/// <summary>
/// 进行控制连接的socket
/// </summary>
private Socket _socketControl;
/// <summary>
/// 传输模式
/// </summary>
private TransferType _trType; /// <summary>
/// 接收和发送数据的缓冲区
/// </summary>
private const int BlockSize = ; /// <summary>
/// 编码方式
/// </summary>
readonly Encoding _ascii = Encoding.ASCII;
/// <summary>
/// 字节数组
/// </summary>
readonly Byte[] _buffer = new Byte[BlockSize];
#endregion #region 属性 /// <summary>
/// FTP服务器IP地址
/// </summary>
public string RemoteHost { get; set; } /// <summary>
/// FTP服务器端口
/// </summary>
public int RemotePort
{
get
{
return _strRemotePort;
}
set
{
_strRemotePort = value;
}
} /// <summary>
/// 当前服务器目录
/// </summary>
public string RemotePath
{
get
{
return _strRemotePath;
}
set
{
_strRemotePath = value;
}
} /// <summary>
/// 登录用户账号
/// </summary>
public string RemoteUser
{
set
{
_strRemoteUser = value;
}
} /// <summary>
/// 用户登录密码
/// </summary>
public string RemotePass
{
set
{
_strRemotePass = value;
}
} /// <summary>
/// 是否登录
/// </summary>
public bool Connected
{
get
{
return _bConnected;
}
}
#endregion #region 链接
/// <summary>
/// 建立连接
/// </summary>
public void Connect()
{
lock (Obj)
{
_socketControl = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
var ep = new IPEndPoint(IPAddress.Parse(RemoteHost), _strRemotePort);
try
{
_socketControl.Connect(ep);
}
catch (Exception)
{
throw new IOException("不能连接ftp服务器");
}
}
ReadReply();
if (_iReplyCode != )
{
DisConnect();
throw new IOException(_strReply.Substring());
}
SendCommand("USER " + _strRemoteUser);
if (!(_iReplyCode == || _iReplyCode == ))
{
CloseSocketConnect();
throw new IOException(_strReply.Substring());
}
if (_iReplyCode != )
{
SendCommand("PASS " + _strRemotePass);
if (!(_iReplyCode == || _iReplyCode == ))
{
CloseSocketConnect();
throw new IOException(_strReply.Substring());
}
}
_bConnected = true;
ChDir(_strRemotePath);
} /// <summary>
/// 关闭连接
/// </summary>
public void DisConnect()
{
if (_socketControl != null)
{
SendCommand("QUIT");
}
CloseSocketConnect();
}
#endregion #region 传输模式
/// <summary>
/// 传输模式:二进制类型、ASCII类型
/// </summary>
public enum TransferType { Binary, ASCII }; /// <summary>
/// 设置传输模式
/// </summary>
/// <param name="ttType">传输模式</param>
public void SetTransferType(TransferType ttType)
{
SendCommand(ttType == TransferType.Binary ? "TYPE I" : "TYPE A");
if (_iReplyCode != )
{
throw new IOException(_strReply.Substring());
}
_trType = ttType;
} /// <summary>
/// 获得传输模式
/// </summary>
/// <returns>传输模式</returns>
public TransferType GetTransferType()
{
return _trType;
}
#endregion #region 文件操作
/// <summary>
/// 获得文件列表
/// </summary>
/// <param name="strMask">文件名的匹配字符串</param>
public string[] Dir(string strMask)
{
if (!_bConnected)
{
Connect();
}
Socket socketData = CreateDataSocket();
SendCommand("NLST " + strMask);
if (!(_iReplyCode == || _iReplyCode == || _iReplyCode == ))
{
throw new IOException(_strReply.Substring());
}
_strMsg = "";
Thread.Sleep();
while (true)
{
int iBytes = socketData.Receive(_buffer, _buffer.Length, );
_strMsg += _ascii.GetString(_buffer, , iBytes);
if (iBytes < _buffer.Length)
{
break;
}
}
char[] seperator = { '\n' };
string[] strsFileList = _strMsg.Split(seperator);
socketData.Close(); //数据socket关闭时也会有返回码
if (_iReplyCode != )
{
ReadReply();
if (_iReplyCode != )
{ throw new IOException(_strReply.Substring());
}
}
return strsFileList;
} public void NewPutByGuid(string strFileName, string strGuid)
{
if (!_bConnected)
{
Connect();
}
string str = strFileName.Substring(, strFileName.LastIndexOf("\\", StringComparison.Ordinal));
string strTypeName = strFileName.Substring(strFileName.LastIndexOf(".", StringComparison.Ordinal));
strGuid = str + "\\" + strGuid;
Socket socketData = CreateDataSocket();
SendCommand("STOR " + Path.GetFileName(strGuid));
if (!(_iReplyCode == || _iReplyCode == ))
{
throw new IOException(_strReply.Substring());
}
var input = new FileStream(strGuid, FileMode.Open);
input.Flush();
int iBytes;
while ((iBytes = input.Read(_buffer, , _buffer.Length)) > )
{
socketData.Send(_buffer, iBytes, );
}
input.Close();
if (socketData.Connected)
{
socketData.Close();
}
if (!(_iReplyCode == || _iReplyCode == ))
{
ReadReply();
if (!(_iReplyCode == || _iReplyCode == ))
{
throw new IOException(_strReply.Substring());
}
}
} /// <summary>
/// 获取文件大小
/// </summary>
/// <param name="strFileName">文件名</param>
/// <returns>文件大小</returns>
public long GetFileSize(string strFileName)
{
if (!_bConnected)
{
Connect();
}
SendCommand("SIZE " + Path.GetFileName(strFileName));
long lSize;
if (_iReplyCode == )
{
lSize = Int64.Parse(_strReply.Substring());
}
else
{
throw new IOException(_strReply.Substring());
}
return lSize;
} /// <summary>
/// 获取文件信息
/// </summary>
/// <param name="strFileName">文件名</param>
/// <returns>文件大小</returns>
public string GetFileInfo(string strFileName)
{
if (!_bConnected)
{
Connect();
}
Socket socketData = CreateDataSocket();
SendCommand("LIST " + strFileName);
if (!(_iReplyCode == || _iReplyCode ==
|| _iReplyCode == || _iReplyCode == ))
{
throw new IOException(_strReply.Substring());
}
byte[] b = new byte[];
MemoryStream ms = new MemoryStream(); while (true)
{
int iBytes = socketData.Receive(b, b.Length, );
ms.Write(b, , iBytes);
if (iBytes <= )
{ break;
}
}
byte[] bt = ms.GetBuffer();
string strResult = Encoding.ASCII.GetString(bt);
ms.Close();
return strResult;
} /// <summary>
/// 删除
/// </summary>
/// <param name="strFileName">待删除文件名</param>
public void Delete(string strFileName)
{
if (!_bConnected)
{
Connect();
}
SendCommand("DELE " + strFileName);
if (_iReplyCode != )
{
throw new IOException(_strReply.Substring());
}
} /// <summary>
/// 重命名(如果新文件名与已有文件重名,将覆盖已有文件)
/// </summary>
/// <param name="strOldFileName">旧文件名</param>
/// <param name="strNewFileName">新文件名</param>
public void Rename(string strOldFileName, string strNewFileName)
{
if (!_bConnected)
{
Connect();
}
SendCommand("RNFR " + strOldFileName);
if (_iReplyCode != )
{
throw new IOException(_strReply.Substring());
}
// 如果新文件名与原有文件重名,将覆盖原有文件
SendCommand("RNTO " + strNewFileName);
if (_iReplyCode != )
{
throw new IOException(_strReply.Substring());
}
}
#endregion #region 上传和下载
/// <summary>
/// 下载一批文件
/// </summary>
/// <param name="strFileNameMask">文件名的匹配字符串</param>
/// <param name="strFolder">本地目录(不得以\结束)</param>
public void Get(string strFileNameMask, string strFolder)
{
if (!_bConnected)
{
Connect();
}
string[] strFiles = Dir(strFileNameMask);
foreach (string strFile in strFiles)
{
if (!strFile.Equals(""))//一般来说strFiles的最后一个元素可能是空字符串
{
Get(strFile, strFolder, strFile);
}
}
} /// <summary>
/// 下载一个文件
/// </summary>
/// <param name="strRemoteFileName">要下载的文件名</param>
/// <param name="strFolder">本地目录(不得以\结束)</param>
/// <param name="strLocalFileName">保存在本地时的文件名</param>
public void Get(string strRemoteFileName, string strFolder, string strLocalFileName)
{
Socket socketData = CreateDataSocket();
try
{
if (!_bConnected)
{
Connect();
}
SetTransferType(TransferType.Binary);
if (strLocalFileName.Equals(""))
{
strLocalFileName = strRemoteFileName;
}
SendCommand("RETR " + strRemoteFileName);
if (!(_iReplyCode == || _iReplyCode == || _iReplyCode == || _iReplyCode == ))
{
throw new IOException(_strReply.Substring());
}
var output = new FileStream(strFolder + "\\" + strLocalFileName, FileMode.Create);
while (true)
{
int iBytes = socketData.Receive(_buffer, _buffer.Length, );
output.Write(_buffer, , iBytes);
if (iBytes <= )
{
break;
}
}
output.Close();
if (socketData.Connected)
{
socketData.Close();
}
if (!(_iReplyCode == || _iReplyCode == ))
{
ReadReply();
if (!(_iReplyCode == || _iReplyCode == ))
{
throw new IOException(_strReply.Substring());
}
}
}
catch
{
socketData.Close();
_socketControl.Close();
_bConnected = false;
_socketControl = null;
}
} /// <summary>
/// 下载一个文件
/// </summary>
/// <param name="strRemoteFileName">要下载的文件名</param>
/// <param name="strFolder">本地目录(不得以\结束)</param>
/// <param name="strLocalFileName">保存在本地时的文件名</param>
public void GetNoBinary(string strRemoteFileName, string strFolder, string strLocalFileName)
{
if (!_bConnected)
{
Connect();
} if (strLocalFileName.Equals(""))
{
strLocalFileName = strRemoteFileName;
}
Socket socketData = CreateDataSocket();
SendCommand("RETR " + strRemoteFileName);
if (!(_iReplyCode == || _iReplyCode == || _iReplyCode == || _iReplyCode == ))
{
throw new IOException(_strReply.Substring());
}
var output = new FileStream(strFolder + "\\" + strLocalFileName, FileMode.Create);
while (true)
{
int iBytes = socketData.Receive(_buffer, _buffer.Length, );
output.Write(_buffer, , iBytes);
if (iBytes <= )
{
break;
}
}
output.Close();
if (socketData.Connected)
{
socketData.Close();
}
if (!(_iReplyCode == || _iReplyCode == ))
{
ReadReply();
if (!(_iReplyCode == || _iReplyCode == ))
{
throw new IOException(_strReply.Substring());
}
}
} /// <summary>
/// 上传一批文件
/// </summary>
/// <param name="strFolder">本地目录(不得以\结束)</param>
/// <param name="strFileNameMask">文件名匹配字符(可以包含*和?)</param>
public void Put(string strFolder, string strFileNameMask)
{
string[] strFiles = Directory.GetFiles(strFolder, strFileNameMask);
foreach (string strFile in strFiles)
{
Put(strFile);
}
} /// <summary>
/// 上传一个文件
/// </summary>
/// <param name="strFileName">本地文件名</param>
public void Put(string strFileName)
{
if (!_bConnected)
{
Connect();
}
Socket socketData = CreateDataSocket();
if (Path.GetExtension(strFileName) == "")
SendCommand("STOR " + Path.GetFileNameWithoutExtension(strFileName));
else
SendCommand("STOR " + Path.GetFileName(strFileName)); if (!(_iReplyCode == || _iReplyCode == ))
{
throw new IOException(_strReply.Substring());
} var input = new FileStream(strFileName, FileMode.Open);
int iBytes;
while ((iBytes = input.Read(_buffer, , _buffer.Length)) > )
{
socketData.Send(_buffer, iBytes, );
}
input.Close();
if (socketData.Connected)
{
socketData.Close();
}
if (!(_iReplyCode == || _iReplyCode == ))
{
ReadReply();
if (!(_iReplyCode == || _iReplyCode == ))
{
throw new IOException(_strReply.Substring());
}
}
} /// <summary>
/// 上传一个文件
/// </summary>
/// <param name="strFileName">本地文件名</param>
///
/// <param name="strGuid"> </param>
public void PutByGuid(string strFileName, string strGuid)
{
if (!_bConnected)
{
Connect();
}
string str = strFileName.Substring(, strFileName.LastIndexOf("\\", StringComparison.Ordinal));
string strTypeName = strFileName.Substring(strFileName.LastIndexOf(".", System.StringComparison.Ordinal));
strGuid = str + "\\" + strGuid;
File.Copy(strFileName, strGuid);
File.SetAttributes(strGuid, FileAttributes.Normal);
Socket socketData = CreateDataSocket();
SendCommand("STOR " + Path.GetFileName(strGuid));
if (!(_iReplyCode == || _iReplyCode == ))
{
throw new IOException(_strReply.Substring());
}
var input = new FileStream(strGuid, FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.Read);
int iBytes = ;
while ((iBytes = input.Read(_buffer, , _buffer.Length)) > )
{
socketData.Send(_buffer, iBytes, );
}
input.Close();
File.Delete(strGuid);
if (socketData.Connected)
{
socketData.Close();
}
if (!(_iReplyCode == || _iReplyCode == ))
{
ReadReply();
if (!(_iReplyCode == || _iReplyCode == ))
{
throw new IOException(_strReply.Substring());
}
}
}
#endregion #region 目录操作
/// <summary>
/// 创建目录
/// </summary>
/// <param name="strDirName">目录名</param>
public void MkDir(string strDirName)
{
if (!_bConnected)
{
Connect();
}
SendCommand("MKD " + strDirName);
if (_iReplyCode != )
{
throw new IOException(_strReply.Substring());
}
} /// <summary>
/// 删除目录
/// </summary>
/// <param name="strDirName">目录名</param>
public void RmDir(string strDirName)
{
if (!_bConnected)
{
Connect();
}
SendCommand("RMD " + strDirName);
if (_iReplyCode != )
{
throw new IOException(_strReply.Substring());
}
} /// <summary>
/// 改变目录
/// </summary>
/// <param name="strDirName">新的工作目录名</param>
public void ChDir(string strDirName)
{
if (strDirName.Equals(".") || strDirName.Equals(""))
{
return;
}
if (!_bConnected)
{
Connect();
}
SendCommand("CWD " + strDirName);
if (_iReplyCode != )
{
throw new IOException(_strReply.Substring());
}
this._strRemotePath = strDirName;
}
#endregion #region 内部函数
/// <summary>
/// 将一行应答字符串记录在strReply和strMsg,应答码记录在iReplyCode
/// </summary>
private void ReadReply()
{
_strMsg = "";
_strReply = ReadLine();
_iReplyCode = Int32.Parse(_strReply.Substring(, ));
} /// <summary>
/// 建立进行数据连接的socket
/// </summary>
/// <returns>数据连接socket</returns>
private Socket CreateDataSocket()
{
SendCommand("PASV");
if (_iReplyCode != )
{
throw new IOException(_strReply.Substring());
}
int index1 = _strReply.IndexOf('(');
int index2 = _strReply.IndexOf(')');
string ipData = _strReply.Substring(index1 + , index2 - index1 - );
int[] parts = new int[];
int len = ipData.Length;
int partCount = ;
string buf = "";
for (int i = ; i < len && partCount <= ; i++)
{
char ch = Char.Parse(ipData.Substring(i, ));
if (Char.IsDigit(ch))
buf += ch;
else if (ch != ',')
{
throw new IOException("Malformed PASV strReply: " + _strReply);
}
if (ch == ',' || i + == len)
{
try
{
parts[partCount++] = Int32.Parse(buf);
buf = "";
}
catch (Exception)
{
throw new IOException("Malformed PASV strReply: " + _strReply);
}
}
}
string ipAddress = parts[] + "." + parts[] + "." + parts[] + "." + parts[];
int port = (parts[] << ) + parts[];
var s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
var ep = new IPEndPoint(IPAddress.Parse(ipAddress), port);
try
{
s.Connect(ep);
}
catch (Exception)
{
throw new IOException("无法连接ftp服务器");
}
return s;
} /// <summary>
/// 关闭socket连接(用于登录以前)
/// </summary>
private void CloseSocketConnect()
{
lock (Obj)
{
if (_socketControl != null)
{
_socketControl.Close();
_socketControl = null;
}
_bConnected = false;
}
} /// <summary>
/// 读取Socket返回的所有字符串
/// </summary>
/// <returns>包含应答码的字符串行</returns>
private string ReadLine()
{
lock (Obj)
{
while (true)
{
int iBytes = _socketControl.Receive(_buffer, _buffer.Length, );
_strMsg += _ascii.GetString(_buffer, , iBytes);
if (iBytes < _buffer.Length)
{
break;
}
}
}
char[] seperator = { '\n' };
string[] mess = _strMsg.Split(seperator);
if (_strMsg.Length > )
{
_strMsg = mess[mess.Length - ];
}
else
{
_strMsg = mess[];
}
if (!_strMsg.Substring(, ).Equals(" ")) //返回字符串正确的是以应答码(如220开头,后面接一空格,再接问候字符串)
{
return ReadLine();
}
return _strMsg;
} /// <summary>
/// 发送命令并获取应答码和最后一行应答字符串
/// </summary>
/// <param name="strCommand">命令</param>
public void SendCommand(String strCommand)
{
lock (Obj)
{
Byte[] cmdBytes = Encoding.ASCII.GetBytes((strCommand + "\r\n").ToCharArray());
_socketControl.Send(cmdBytes, cmdBytes.Length, );
Thread.Sleep();
ReadReply();
}
}
#endregion
}
}

FTPClientHelper

5.FTP常用的命令

 #region 程序集 System.dll, v4.0.0.0
// C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\System.dll
#endregion using System; namespace System.Net
{
// 摘要:
// System.Net.WebRequestMethods.Ftp、System.Net.WebRequestMethods.File 和 System.Net.WebRequestMethods.Http
// 类的容器类。无法继承此类
public static class WebRequestMethods
{ // 摘要:
// 表示可用于 FILE 请求的文件协议方法的类型。无法继承此类。
public static class File
{
// 摘要:
// 表示用来从指定的位置检索文件的 FILE GET 协议方法。
public const string DownloadFile = "GET";
//
// 摘要:
// 表示用来将文件复制到指定位置的 FILE PUT 协议方法。
public const string UploadFile = "PUT";
} // 摘要:
// 表示可与 FTP 请求一起使用的 FTP 协议方法的类型。无法继承此类。
public static class Ftp
{
// 摘要:
// 表示要用于将文件追加到 FTP 服务器上的现有文件的 FTP APPE 协议方法。
public const string AppendFile = "APPE";
//
// 摘要:
// 表示要用于删除 FTP 服务器上的文件的 FTP DELE 协议方法。
public const string DeleteFile = "DELE";
//
// 摘要:
// 表示要用于从 FTP 服务器下载文件的 FTP RETR 协议方法。
public const string DownloadFile = "RETR";
//
// 摘要:
// 表示要用于从 FTP 服务器上的文件检索日期时间戳的 FTP MDTM 协议方法。
public const string GetDateTimestamp = "MDTM";
//
// 摘要:
// 表示要用于检索 FTP 服务器上的文件大小的 FTP SIZE 协议方法。
public const string GetFileSize = "SIZE";
//
// 摘要:
// 表示获取 FTP 服务器上的文件的简短列表的 FTP NLIST 协议方法。
public const string ListDirectory = "NLST";
//
// 摘要:
// 表示获取 FTP 服务器上的文件的详细列表的 FTP LIST 协议方法。
public const string ListDirectoryDetails = "LIST";
//
// 摘要:
// 表示在 FTP 服务器上创建目录的 FTP MKD 协议方法。
public const string MakeDirectory = "MKD";
//
// 摘要:
// 表示打印当前工作目录的名称的 FTP PWD 协议方法。
public const string PrintWorkingDirectory = "PWD";
//
// 摘要:
// 表示移除目录的 FTP RMD 协议方法。
public const string RemoveDirectory = "RMD";
//
// 摘要:
// 表示重命名目录的 FTP RENAME 协议方法。
public const string Rename = "RENAME";
//
// 摘要:
// 表示将文件上载到 FTP 服务器的 FTP STOR 协议方法。
public const string UploadFile = "STOR";
//
// 摘要:
// 表示将具有唯一名称的文件上载到 FTP 服务器的 FTP STOU 协议方法。
public const string UploadFileWithUniqueName = "STOU";
} // 摘要:
// 表示可与 HTTP 请求一起使用的 HTTP 协议方法的类型。
public static class Http
{
// 摘要:
// 表示与代理一起使用的 HTTP CONNECT 协议方法,该代理可以动态切换到隧道,如 SSL 隧道的情况。
public const string Connect = "CONNECT";
//
// 摘要:
// 表示一个 HTTP GET 协议方法。
public const string Get = "GET";
//
// 摘要:
// 表示一个 HTTP HEAD 协议方法。除了服务器在响应中只返回消息头不返回消息体以外,HEAD 方法和 GET 是一样的。
public const string Head = "HEAD";
//
// 摘要:
// 表示一个 HTTP MKCOL 请求,该请求在请求 URI(统一资源标识符)指定的位置新建集合,如页的集合。
public const string MkCol = "MKCOL";
//
// 摘要:
// 表示一个 HTTP POST 协议方法,该方法用于将新实体作为补充发送到某个 URI。
public const string Post = "POST";
//
// 摘要:
// 表示一个 HTTP PUT 协议方法,该方法用于替换 URI 标识的实体。
public const string Put = "PUT";
}
}
}

WebRequestMethods

慢慢积累,你的这些代码都是你的财富,可以帮你提高工作效率,勤勤恳恳的干好每件事情,点滴积累,开心编程。

【C#公共帮助类】FTPClientHelper帮助类,实现文件上传,目录操作,下载等动作的更多相关文章

  1. spring mvc源码-》MultipartReques类-》主要是对文件上传进行的处理,在上传文件时,编码格式为enctype="multipart/form-data"格式,以二进制形式提交数据,提交方式为post方式。

    spring mvc源码->MultipartReques类-> MultipartReques类主要是对文件上传进行的处理,在上传文件时,编码格式为enctype="multi ...

  2. PHP多文件上传类

    <?php class Upload{ var $saveName;// 保存名 var $savePath;// 保存路径 var $fileFormat = array('gif','jpg ...

  3. ASP.NET 文件上传类 简单好用

    调用: UploadFile uf = new UploadFile(); /*可选参数*/ uf.SetIsUseOldFileName(true);//是否使用原始文件名作为新文件的文件名(默认: ...

  4. spring mvc 文件上传工具类

    虽然文件上传在框架中,已经不是什么困难的事情了,但自己还是开发了一个文件上传工具类,是基于springmvc文件上传的. 工具类只需要传入需要的两个参数,就可以上传到任何想要上传的路径: 参数1:Ht ...

  5. PHP实现的多文件上传类及用法示例

    这篇文章主要介绍了PHP实现的多文件上传类及用法,详细分析了php实现的多文件上传类与具体的使用技巧,需要的朋友可以参考下 1.upFiles.css.php 文件 <?php class Up ...

  6. C# FTPClientHelper共公类 实现文件上传,目录操作,下载等动作

    文档说明 本文档使用Socket通信方式来实现ftp文件的上传下载等命令的执行 1.基本介绍 由于最近的项目是客户端的程序,需要将客户端的图片文件[切图]-[打包]-[ftp上传],现在就差最后一步了 ...

  7. HTML5文件上传器,纯脚本无插件的客户端文件上传器---Uploader 文件上传器类

    概述 客户端完全基于JavaScript的 浏览器文件上传器,不需要任何浏览器插件,但需要和jQuery框架协同工作,支持超大文件上传,其算法是将一个超大文件切片成N个数据块依次提交给服务 端处理,由 ...

  8. THINKPHP源码学习--------文件上传类

    TP图片上传类的理解 在做自己项目上传图片的时候一直都有用到TP的上传图片类,所以要进入源码探索一下. 文件目录:./THinkPHP/Library/Think/Upload.class.php n ...

  9. tp文件上传;org/RBAC.class.php 权限类;think/page,class,php分页类;

    一.上传表单: 注意,要使用上传功能 你的表单需要设置 enctype="multipart/form-data" <form action="__URL__/up ...

随机推荐

  1. [.net 面向对象程序设计深入](0) 开篇

    [.net 面向对象程序设计深入](0)开篇        [.net 面向对象编程基础]和 [.net 面向对象程序设计进阶]在15年底写完了,群里也加进来不少热爱学习的小伙伴.让我深切感受到在这个 ...

  2. JWS.Mono如何进行“在线安装”

    这里话就不多说了,使用方法如下: wget http://jhonge.net/down4load/1413998270361/jwsmono_net.sh chmod a+x jwsmono_net ...

  3. 【Paddy】如何将物理表分割成动态数据表与静态数据表

    前言 一般来说,物理表的增.删.改.查都受到数据量的制约,进而影响了性能. 很多情况下,你所负责的业务关键表中,每日变动的数据库与不变动的数据量比较,相差非常大. 这里我们将变动的数据称为动态数据,不 ...

  4. 《Entity Framework 6 Recipes》中文翻译系列 (38) ------ 第七章 使用对象服务之动态创建连接字符串和从数据库读取模型

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 第七章 使用对象服务 本章篇幅适中,对真实应用中的常见问题提供了切实可行的解决方案. ...

  5. failed to load the jni shared library jvm

    启动eclipse luna时候出现的, 原因在于,eclipse要求jdk是 32位的, 而我本机安装的是 64的!

  6. Linux study

    在centos5.5中编译LNMP环境 一.配置好ip, dns, 网关, 确保使用远程连接工具能够连接服务器 centos设置ip地址,网关, dns教程: http://www.osyumwei. ...

  7. js创建对象的高级模式

    hello,安瑞万.第一次写博客,心情很激动啊.要是说的不好,你来打我啊?反正你也不知道我家地址.好了,不扯了.进入正题:要是写的不好欢迎大家来批评指导. what:创建对象的三种模式 --1,门户大 ...

  8. iOS点击状态栏回到顶部底层实现原理

    在iOS开发中,苹果其实已经帮你实现了点击状态栏回到顶部这个功能,但我们在开发中会遇到点击不能回到顶部.其实这都和 ScrollView中的一个属性scrollsToTop有关,我们先看看苹果关于这个 ...

  9. JS原生基础终结篇 (帅哥)

    闭包 基础    面向对象基础 1.1 闭包 在程序语言中,所谓闭包,是指语法域位于某个特定的区域,具有持续参照(读写)位于该区域内自身范围之外的执行域上的非持久型变量值能力的段落.这些外部执行域的非 ...

  10. 【求助】WPF 在XP下 有的Textbox光标会消失

    最近做个项目,一直有一个问题没有解决,就是在XP下,有的Textbox里在文本框里没有东西的时候,会没有光标.不同的XP机器,失去光标的Textbox也不一样. 各位大师看下面的三张图,当Textbo ...