关于本文档的说明

  本文档使用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. 软件工程(QLGY2015)博客点评总结

    目录 第一次作业(2015.5.9) 第二次作业(2015.5.21) 第三次作业(2015.6.11) 2015上半年软工助教总结 第一次作业(2015.5.9) 存在主要问题 1)书写这种练习博客 ...

  2. [.net 面向对象程序设计深入](1)UML——在Visual Studio 2013/2015中设计UML类图

    [.net 面向对象程序设计深入](1)UML——在Visual Studio 2013/2015中设计UML类图 1.UML简介 Unified Modeling Language (UML)又称统 ...

  3. 单节点部署Hadoop教程

    搭建HDFS 增加主机名 我这里仅仅增加了master主机名 [root@10 /xinghl/hadoop/bin]$ cat /etc/hosts 127.0.0.1 localhost 10.0 ...

  4. Oozie 快速入门

    设想一下,当你的系统引入了spark或者hadoop以后,基于Spark和Hadoop已经做了一些任务,比如一连串的Map Reduce任务,但是他们之间彼此右前后依赖的顺序,因此你必须要等一个任务执 ...

  5. 负载均衡session会话保持方法

    负载均衡时,为了保证同一用户session会被分配到同一台服务器上,可以使用以下方法:1.使用cookie将用户的session存入cookie里,当用户分配到不同的服务器时,先判断服务器是否存在该用 ...

  6. 导入镜像文件,分区启动liunx

    1:更改虚拟机配置 2:导入系统镜像 3:启动虚拟机,选择第一个选项回车 4:这里问你是否检查镜像,我们的镜像肯定没问题不需要检查,点击Skip 5:语言选择,按提示默认下一步 6:主机名也默认 7: ...

  7. 【JQ+锚标记实现点击页面回到顶部】

    前言:今天想写个页面常用到的[点击回到页面顶部或是首页的功能],生活和职场一样,总会有低谷的时候,这个时候咱也别怂.别怂.别怂,说三遍!那都不是事,工作没了,再找呗,就像我上周五,团队解散那天,我是笑 ...

  8. 没有水果机的也来体验下Visual Studio for Mac

    在去年微软已经宣布.NET将实现真正的跨平台,并且发布了Mac和Linux版的Visual Studio Code编辑器,但强大的Visual Studio确只有Windows版. 还坚守.NET开发 ...

  9. SSISDB3:Environments 和 Environment Variables

    Environment 是ETL执行时使用的Parameters的集合,可以为一个Project引用不同的Environment variables,从而改变ETL执行的属性. 查看Environme ...

  10. A Simple OpenGL Shader Example II

    A Simple OpenGL Shader Example II eryar@163.com Abstract. The OpenGL Shading Language syntax comes f ...