关于本文档的说明

  本文档使用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. Scrum Guide - Scrum指南中文版

    现在公司在使用敏捷开发模式进行日常的开发和管理工作,所以我看了下Ken Schwaber的<Scrum Guide>这本小册子,原本是英文的,这里提供中文的,以供日后复习和参考. Scru ...

  2. Hadoop学习笔记—11.MapReduce中的排序和分组

    一.写在之前的 1.1 回顾Map阶段四大步骤 首先,我们回顾一下在MapReduce中,排序和分组在哪里被执行: 从上图中可以清楚地看出,在Step1.4也就是第四步中,需要对不同分区中的数据进行排 ...

  3. CoreData教程

    网上关于CoreData的教程能搜到不少,但很多都是点到即止,真正实用的部分都没有讲到,而基本不需要的地方又讲了太多,所以我打算根据我的使用情况写这么一篇实用教程.内容将包括:创建entity.创建r ...

  4. Redis系列(四)-低成本高可用方案设计

    关于Redis高可用方案,看到较多的是keepalived.zookeeper方案. keepalived是主备模式,意味着总有一台浪费着.zookeeper工作量成本偏高. 本文主要介绍下使用官方s ...

  5. 七天学会ASP.NET MVC (一)——深入理解ASP.NET MVC

    系列文章 七天学会ASP.NET MVC (一)——深入理解ASP.NET MVC 七天学会ASP.NET MVC (二)——ASP.NET MVC 数据传递 七天学会ASP.NET MVC (三)— ...

  6. Linux学习之Exam系统发布

    配置时间:2015年11月27日 配置人:撰写人:微冷的雨   Happy 01.Linux安装图 欢迎页面 桌面 02.Linux命令之文件目录操作 给北大青鸟五道口校区创建三个机房(L4,L5,L ...

  7. C语言 · 寻找数组中的最大值

    问题描述 对于给定整数数组a[],寻找其中最大值,并返回下标. 输入格式 整数数组a[],数组元素个数小于1等于100.输出数据分作两行:第一行只有一个数,表示数组元素个数:第二行为数组的各个元素. ...

  8. 每天一个linux命令(45):free 命令

    free命令可以显示Linux系统中空闲的.已用的物理内存及swap内存,及被内核使用的buffer.在Linux系统监控的工具中,free命令是最经常使用的命令之一. 1.命令格式: free [参 ...

  9. webpack进阶构建项目(一)

    webpack进阶构建项目(一) 阅读目录 1.理解webpack加载器 2.html-webpack-plugin学习 3.压缩js与css 4.理解less-loader加载器的使用 5.理解ba ...

  10. SVN代码冲突解决方案小集合

    对于刚接触svn的人来说,svn冲突后,不能提交是件让人很郁闷的事情.最让人郁闷的事,是代码间的覆盖.你把我代码盖了,我会很火大的.谁把谁的盖了都不爽. 为什么会出现代码冲突问题呢,因为不同的人,同时 ...