文章目录
1 FTP
FTP(File Transfer Protocol)文件传输协议,是支持 Internet 文件传输的各种规则所组成的集合。
FTP 文件传输协议使 Internet 用户可以把文件从一台主机拷贝到另一台主机上;除此之外,FTP 还提供登录、目录查询以及其他会话控制等功能。
1.1 工作原理
FTP 的本质是 TCP 通信。通过 FTP 传输文件,双发至少需要建立两个 TCP 连接。
- 一个称为控制连接,用于传输 FTP命令。
- 一个称为数据连接,用于传输文件数据。

数据连接和控制连接方向一般是相反的。
用户使用 FTP 客户端连接 FTP 服务区,请求下载文件。
- 控制连接方向:客户端主动连接服务器告知其下载命令。
- 数据连接方向:服务端主动连接客户端下发数据。
一般情况下,使用 FTP 传输文件时,客户端必须先登录服务器,获得相应权限后,才能上传或下载文件。
服务器也可以允许用户匿名登录 FTP,不需要都拥有一个合法账号。
1.2 传输模式
当客户端和 FTP 服务器建立控制连接后,需要告诉服务器采用那种传输模式。
-
主动模式 (Port模式)
服务器主动连接客户端,然后传输文件 。
-
被动模式 (Passive模式)
客户端主动连接服务器 即控制连接和数据连接都由客户端发起。
在使用 FTP 进行数据传输时,有两种数据传输方式。
-
ASCII 传输方式
以 ASCII 编码方式传输数据,适用于传输仅包含英文的命令和参数或者英文文本文件 。
-
二进制传输方式(建议使用该方式)
可以指定采用哪种编码传输命令和文件数据。如果传输的文件不是英文文件则应该采用该方式。
2 搭建 FTP 服务器
配置环境
- windows 11
2.1 启用服务
- 点击 windows 菜单,在搜索框内输入“控制面板”并打开。

- 点击“程序”->“启用或关闭 Windows 功能”。


- 安装 FTP,web 管理工具,internet 可承载的 web 核心。

2.2 配置站点
-
通过在 “开始” 菜单中搜索 “IIS” 来找到 “Internet Information Services (IIS) 管理器” 并打开。
-
鼠标右键左侧的“网站”,点击“添加 FTP 站点”。
-
填入自己的站点名称,并选择物理路径。
-
继续配置自己电脑的 IP 地址。
IP 地址在这里查看。
-
选择身份验证方式和授权规则。身份验证可以选择
- “匿名”(允许任何人访问)。
- “基本”(需要用户名和密码)。
授权规则可以设置允许哪些用户或用户组访问,以及访问权限(读取、写入等)。

2.3 设置防火墙
-
配置完成后,需要进入防火墙设置允许应用通过。
到此,所有用户均可直接通过“ftp://你的 IP”访问服务器。

2.4 指定用户登录
- 在 windows 菜单中搜索“计算机管理”并进入。

-
展开窗口左侧的“本地用户和组”,点击“用户”,窗口右侧即为用户列表。
右键单击空白处,点击新用户,此时将弹出新用户创建窗口。

- 创建你的用户。

- 回到 “Internet Information Services (IIS) 管理器”,进入“FTP 授权规则”。

-
点击右侧“添加允许规则”,填写刚创建的用户。
本文创建了用户名:FTPUser,密码:123456。

到此,用户通过“ftp://你的 IP”访问服务器时,需要密码验证。

3 常用 API
3.1 NetworkCredential
- 命名空间:
System.Net
- 用途:用于在 FTP 文件传输时设置账号密码。
NetworkCredential n = new NetworkCredential("用户名", "密码");
3.2 FtpWebRequest
-
命名空间:
System.Net
-
用途:FTP 文件传输协议客户端操作类,主要用于上传、下载、删除服务器上的文件。
重要方法
Create()
- 创建新的WebRequest,用于进行FTP相关操作
FtpWebRequest req = FtpWebRequest.Create(new Uri("ftp://127.0.0.1/Test.txt")) as FtpWebRequest;
req.Abort()
- 终止正在进行的文件传输。req.GetRequestStream()
- 获取用于上传的流。req.GetResponse()
- 返回 FTP 服务器响应。
重要成员
req.Credentials
- 通信凭证,设置为 NetworkCredential 对象。
req.Credentials = n;
req.KeepAlive
- 控制完成请求后是否关闭到 FTP 服务器的连接(默认为 true 不关闭)。req.Method
- 操作命令设置(来自WebRequestMethods.Ftp
类):DeleteFile
- 删除文件。DownloadFile
- 下载文件。ListDirectory
- 获取文件简短列表。ListDirectoryDetails
- 获取文件详细列表。MakeDirectory
- 创建目录。RemoveDirectory
- 删除目录。UploadFile
- 上传文件。
req.UseBinary
- 是否使用二进制传输(推荐设置为 true)。
3.3 FtpWebResponse
- 命名空间:
System.Net
- 用途:封装 FTP 服务器对请求的响应,提供操作状态和下载数据。
FtpWebResponse res = req.GetResponse() as FtpWebResponse;
重要方法
res.Close()
- 释放所有资源。res.GetResponseStream()
- 返回从 FTP 服务器下载数据的流。
重要成员
res.ContentLength
- 接收数据的长度。res.ContentType
- 接收数据的类型。res.StatusCode
- FTP 服务器下发的最新状态码。res.StatusDescription
- 状态代码的文本描述。res.BannerMessage
- 登录前服务器发送的消息。res.ExitMessage
- FTP 会话结束时服务器发送的消息。res.LastModified
- 服务器上文件的上次修改日期和时间。
4 实战操作
4.1 上传文件
- 在 Unity 项目中创建 StreamingAssets 文件夹,并放入一张图片“test.png”。

-
创建以下脚本,并挂载到场景上。
using UnityEngine; namespace Lesson { using System; using System.IO; using System.Net; public class Lesson20 : MonoBehaviour { private void Start() { try { // 创建一个FTP请求 var req = WebRequest.Create($"ftp://你的IP地址/pic_{DateTime.Now:yyyy-M-d-HH-mm-ss}.png") as FtpWebRequest; // 设置FTP请求的用户名和密码 req.Credentials = new NetworkCredential("FTPUser", "123456"); // 设置代理为空 req.Proxy = null; // 设置保持连接为true req.KeepAlive = true; // 设置请求方法为上传文件 req.Method = WebRequestMethods.Ftp.UploadFile; // 设置使用二进制上传 req.UseBinary = true; // 获取请求流 var upLoadStream = req.GetRequestStream(); // 打开要上传的文件 using (var file = File.OpenRead(Application.streamingAssetsPath + "/test.png")) { // 创建一个字节数组 var bytes = new byte[1024]; // 读取文件内容到字节数组 var contentLength = file.Read(bytes, 0, bytes.Length); // 循环读取文件内容,直到文件内容读取完毕 while (contentLength > 0) { // 将字节数组写入请求流 upLoadStream.Write(bytes, 0, contentLength); // 继续读取文件内容 contentLength = file.Read(bytes, 0, bytes.Length); } // 关闭文件流 file.Close(); // 关闭请求流 upLoadStream.Close(); // 打印上传成功信息 print("upload success"); } } catch (Exception e) { // 打印异常信息 Console.WriteLine(e); // 抛出异常 throw; } } } }
-
运行 Unity,即可传输 test.png 到 FTP 服务器上。
4.2 下载文件
-
在 FTP 服务器上准备一个文件,这里以 Test.txt 为例。
-
创建以下脚本,并挂载到场景上。
using UnityEngine; namespace Lesson { using System; using System.IO; using System.Net; public class Lesson21 : MonoBehaviour { private void Start() { try { // 创建一个WebRequest对象,指定FTP地址 var req = WebRequest.Create("ftp://你的IP地址/Test.txt") as FtpWebRequest; // 设置FTP登录凭证 req.Credentials = new NetworkCredential("FTPUser", "123456"); // 设置代理为空 req.Proxy = null; // 设置保持连接为true req.KeepAlive = true; // 设置请求方法为下载文件 req.Method = WebRequestMethods.Ftp.DownloadFile; // 设置使用二进制传输 req.UseBinary = true; // 获取响应 var res = req.GetResponse() as FtpWebResponse; // 获取响应流 var downLoadStream = res.GetResponseStream(); // 创建文件 using (var file = File.Create(Application.streamingAssetsPath + $"/test_{DateTime.Now:yyyy-M-d-HH-mm-ss}.txt")) { // 创建一个字节数组 var bytes = new byte[1024]; // 读取响应流中的数据 var contentLength = downLoadStream.Read(bytes, 0, bytes.Length); // 循环读取数据,直到读取完毕 while (contentLength > 0) { // 将数据写入文件 file.Write(bytes, 0, contentLength); // 继续读取数据 contentLength = downLoadStream.Read(bytes, 0, bytes.Length); } // 关闭响应流 downLoadStream.Close(); // 关闭文件 file.Close(); // 打印下载成功 print("download success"); } } catch (Exception e) { // 打印异常信息 Console.WriteLine(e.Message); // 抛出异常 throw; } } } }
-
运行 Unity,即可从 FTP 服务器上下载 Test.txt 到 StreamingAssets 文件夹中。
4.3 删除文件
和上述操作类似,直接上代码。
using UnityEngine;
namespace Lesson
{
using System;
using System.IO;
using System.Net;
public class Lesson22 : MonoBehaviour
{
private void Start()
{
try
{
// 创建一个WebRequest对象,指定FTP地址
var req = WebRequest.Create("ftp://你的IP地址/Test.txt") as FtpWebRequest;
// 设置FTP登录凭证
req.Credentials = new NetworkCredential("FTPUser", "123456");
// 设置代理为空
req.Proxy = null;
// 设置保持连接为true
req.KeepAlive = true;
// 设置请求方法为删除文件
req.Method = WebRequestMethods.Ftp.DeleteFile;
// 获取响应
var res = req.GetResponse() as FtpWebResponse;
// 关闭响应流
res.Close();
// 打印下载成功
print("delete success");
}
catch (Exception e)
{
// 打印异常信息
Console.WriteLine(e.Message);
// 抛出异常
throw;
}
}
}
}
4.4 获取文件大小
using UnityEngine;
namespace Lesson
{
using System;
using System.IO;
using System.Net;
public class Lesson22 : MonoBehaviour
{
private void Start()
{
try
{
// 创建一个WebRequest对象,指定FTP地址
var req = WebRequest.Create("ftp://你的IP地址/Test.txt") as FtpWebRequest;
// 设置FTP登录凭证
req.Credentials = new NetworkCredential("FTPUser", "123456");
// 设置代理为空
req.Proxy = null;
// 设置保持连接为true
req.KeepAlive = true;
// 设置请求方法为获取文件大小
req.Method = WebRequestMethods.Ftp.GetFileSize;
// 获取响应
var res = req.GetResponse() as FtpWebResponse;
// 打印文件大小
print(res.ContentLength);
// 关闭响应流
res.Close();
// 打印下载成功
print("delete success");
}
catch (Exception e)
{
// 打印异常信息
Console.WriteLine(e.Message);
// 抛出异常
throw;
}
}
}
}
4.5 创建文件夹
using UnityEngine;
namespace Lesson
{
using System;
using System.IO;
using System.Net;
public class Lesson22 : MonoBehaviour
{
private void Start()
{
try
{
// 创建一个WebRequest对象,指定FTP地址
var req = WebRequest.Create("ftp://你的IP地址/TestDir") as FtpWebRequest;
// 设置FTP登录凭证
req.Credentials = new NetworkCredential("FTPUser", "123456");
// 设置代理为空
req.Proxy = null;
// 设置保持连接为true
req.KeepAlive = true;
// 设置请求方法为创建文件夹
req.Method = WebRequestMethods.Ftp.MakeDirectory;
// 获取响应,创建文件夹
var res = req.GetResponse() as FtpWebResponse;
// 关闭响应流
res.Close();
// 打印下载成功
print("delete success");
}
catch (Exception e)
{
// 打印异常信息
Console.WriteLine(e.Message);
// 抛出异常
throw;
}
}
}
}
4.6 获取文件与文件夹名
using UnityEngine;
namespace Lesson
{
using System;
using System.IO;
using System.Net;
public class Lesson22 : MonoBehaviour
{
private void Start()
{
try
{
// 创建一个WebRequest对象,指定FTP地址
var req = WebRequest.Create("ftp://你的IP地址/TestDir") as FtpWebRequest;
// 设置FTP登录凭证
req.Credentials = new NetworkCredential("FTPUser", "123456");
// 设置代理为空
req.Proxy = null;
// 设置保持连接为true
req.KeepAlive = true;
// 设置请求方法为读取文件夹信息
req.Method = WebRequestMethods.Ftp.ListDirectory;
// 获取响应
var res = req.GetResponse() as FtpWebResponse;
// 创建一个StreamReader对象,用于读取从res对象中获取的响应流
var streamReader = new StreamReader(res.GetResponseStream());
// 读取所有响应内容,包括文件名和文件夹名
// var dir = streamReader.ReadToEnd();
// print(dir);
// 逐行读取响应内容
string line = streamReader.ReadLine();
while (line != null)
{
print(line);
line = streamReader.ReadLine();
}
// 关闭响应流
res.Close();
// 打印下载成功
print("delete success");
}
catch (Exception e)
{
// 打印异常信息
Console.WriteLine(e.Message);
// 抛出异常
throw;
}
}
}
}