UH3L4——上传AB包和信息文件

搭建FTP服务器

本次我们使用别人做好的FTP服务器软件来搭建FTP服务器:更多内容请看:UN3L2——搭建FTP服务器

注意:实际开发中,搭建FTP服务器的工作一般由后端程序来完成,不需要我们前端程序来完成
后端程序搭建好后,给你相关的信息,我们访问即可

下载安装Serv-U等FTP服务器软件,在想要作为FTP服务器的电脑上运行即可
(推荐使用同一局域网(路由器或者WIFI)下的第二台设备学习,前提是有)

  1. 打开Serv-U,创建域,直接不停下一步即可,加密选择使用单向加密
  2. 创建用于上传的FTP账号密码
    创建用于下载的FTP匿名账号(用户名:Anonymous,密码:无,设置只读权限)
  3. 检查作为服务器设备当前IP地址,在cmd或者powershell里输入ipconfig即可查看,客户端使用该IP地址访问服务器

上传AB包和资源对比文件

前置知识点

  • C#异步函数
  • ​Task​任务类
  • UN3L4——FTP上传文件
  • 上节课生成的AB包资源对比文件

实现流程

  • 使用特性为菜单栏添加一个选项AB包工具/上传AB包和对比文件​,从选项里触发该功能UploadABFile()

  • UploadABFile​中

    1. 遍历AB包文件夹,通过后缀名识别文件,获取所有AB包文件和资源对比文件消息
    2. 遍历要上传的文件,依次上传,上传函数是FtpUploadFile​,需要传入文件名和上传路径
  • FtpUploadFile​中

    1. 使用async​方法来异步执行上传逻辑,避免上传卡死主线程,在try...catch​内执行上传逻辑,避免上传出错让程序崩溃
    2. 使用FTP上传文件的知识让AB包和资源对比消息被上传到AB包内
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
using System;
using System.IO;
using System.Net;
using System.Threading.Tasks;
using UnityEditor;
using UnityEngine;

public class UploadAB
{
[MenuItem("AB包工具/上传AB包和对比文件")]
private static void UploadABFile()
{
DirectoryInfo directory = new DirectoryInfo(Application.dataPath + "/ArtRes/AB/PC/");
FileInfo[] fileInfos = directory.GetFiles();

foreach (FileInfo info in fileInfos)
{
//检查后缀,没有后缀的是AB包,txt后缀的是资源对比文件,这两个才是需要上传的内容
if (info.Extension == "" ||
info.Extension == ".txt")
{
//上传该文件
FtpUploadFile(info.FullName, info.Name);
}
}
}

private static async void FtpUploadFile(string filePath, string fileName)
{
await Task.Run(() =>
{
try
{
//创建一个FTP连接 用于上传
FtpWebRequest request = FtpWebRequest.Create(new Uri("ftp://192.168.1.101/AB/PC/" + fileName)) as FtpWebRequest;
//设置通信凭证
NetworkCredential credential = new NetworkCredential("MrTang", "MrTang123");
request.Credentials = credential;
//其他设置:代理设置为null,请求完毕后关闭控制连接,操作命令设置为上传,指定传输二进制类型数据
request.Proxy = null;
request.KeepAlive = false;
request.Method = WebRequestMethods.Ftp.UploadFile;
request.UseBinary = true;
//获取上传流
Stream upLoadStream = request.GetRequestStream();
//获取读取文件的流
using (FileStream file = File.OpenRead(filePath))
{
//使用字节数组一点一点的从文件里读取内容,并写入到文件流内
byte[] bytes = new byte[2048];
int 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();
}
Debug.Log($"{fileName}上传成功");
}
catch (Exception e)
{
Debug.Log($"{fileName}上传失败:{e.Message}");
}
});
}
}