最近在整一个定时将钉钉云盘所有文件下载下来的服务,其中因为api只能拿到单独文件的关系,因此逻辑比较绕
经过设计后,进行代码的编写;
设计逻辑:
1、首先先从apollo拿到所需的appkey和APPsecret,用于获取accesstoken,以及获取能获取到全部文件的用户的unionid。
2、获取到的unionid和token用于获取该用户云盘下的全部文件夹信息,从返回到的json信息中获取spaces内容,并序列化成列表(每个文件夹都有自己的spaceid)。
3、在应用层对spaceid列表进行遍历,对每个spaceid进行接下来的操作。
4、调用获取文件列表接口,将返回结果序列化,因为存在分页机制。如果返回结果中存在nextToken则将此参数进行再次调用,进行序列化后再对列表进行拼接。当文件类型是文件时,与表里的fileid进行一次比对,如果存在就跳过,如果不存在则存入新的list中,当文件类型是文件夹时,递归查询该文件夹下的文件,将列表返回与原列表拼接。
5、将文件列表中的fileid取出并获取下载信息,进行文件的下载,同时获取文件信息,并将文件信息中的人员id拿到人员信息,将文件转换为base64字节和人员信息一齐发送到文件下载服务,最后将文件信息存入表中。
在ddd模式的application层进行循环的编写
这里最主要的是要进行一个文件的递归,代码较长,只放出一部分抛砖引玉
public List<SortedList<string, string>> GetFileList1(string spaceId, string accessToken, string nextToken, List<SortedList<string, string>> list, string unionId, string parentId)
{
bool flag = nextToken == null || nextToken == "";
List<SortedList<string, string>> result;
if (flag)
{
Dictionary<string, string> dictionary = new Dictionary<string, string>();
dictionary.Add("unionId", unionId);
dictionary.Add("maxResults", "50");
dictionary.Add("orderType", "createTimeDesc");
dictionary.Add("parentId", parentId);
string url = "https://api.dingtalk.com/v1.0/drive/spaces/" + spaceId + "/files";
string text = HttpHelper.Get(url, dictionary, accessToken);
SortedList<string, object> sortedList = JsonConvert.DeserializeObject<SortedList<string, object>>(text);
JObject jobject = JObject.Parse(text);
string nextToken1 = Convert.ToString(sortedList["nextToken"]);
string value = jobject["files"].ToString();
//筛选出仅有文件列表的list
List<SortedList<string, string>> olist = new List<SortedList<string, string>>();
olist = JsonConvert.DeserializeObject<List<SortedList<string, string>>>(value);
//用于递归的列表list
List<SortedList<string, string>> dlist = new List<SortedList<string, string>>();
//最终拼接出的文件列表list
List<SortedList<string, string>> flist = new List<SortedList<string, string>>();
foreach (SortedList<string, string> sortedList2 in olist)
{
//判断文件夹是否存在
bool flag2 = sortedList2["fileType"] == "folder";
if (flag2)
{
//存在文件夹,进入递归
dlist = this.GetFileList2(spaceId, accessToken, nextToken1, list, unionId, sortedList2["fileId"]);
flist.AddRange(dlist);
}
else
{
//不存在文件夹,先与表比对
DingPanPo dingPanPoByID = this.dingPanRepository.GetDingPanPoByID(sortedList2["fileId"]);
bool flag3 = dingPanPoByID == null;
if (!flag3)
{
break;
}
//不存在此文件,加入文件列表flist中
flist.Add(new SortedList<string, string>
{
{
"fileId",
sortedList2["fileId"]
}
});
}
}
//查看是否存在nextToken
bool flag4 = nextToken1 == null || nextToken1 == "";
if (flag4)
{
result = flist;
}
else
{
//进入递归
dlist = this.GetFileList2(spaceId, accessToken, nextToken1, flist, unionId, null);
result = dlist;
}
}
else
{
Dictionary<string, string> dictionary2 = new Dictionary<string, string>();
dictionary2.Add("unionId", unionId);
dictionary2.Add("maxResults", "50");
dictionary2.Add("orderType", "createTimeDesc");
dictionary2.Add("parentId", parentId);
dictionary2.Add("nextToken", nextToken);
string url2 = "https://api.dingtalk.com/v1.0/drive/spaces/" + spaceId + "/files";
string text3 = HttpHelper.Get(url2, dictionary2, accessToken);
SortedList<string, object> sortedList3 = JsonConvert.DeserializeObject<SortedList<string, object>>(text3);
JObject jobject2 = JObject.Parse(text3);
string text4 = Convert.ToString(sortedList3["nextToken"]);
string value2 = jobject2["files"].ToString();
List<SortedList<string, string>> list5 = new List<SortedList<string, string>>();
list5 = JsonConvert.DeserializeObject<List<SortedList<string, string>>>(value2);
List<SortedList<string, string>> list6 = new List<SortedList<string, string>>();
List<SortedList<string, string>> list7 = new List<SortedList<string, string>>();
foreach (SortedList<string, string> sortedList4 in list5)
{
bool flag5 = sortedList4["fileType"] == "folder";
if (flag5)
{
list6 = this.GetFileList2(spaceId, accessToken, text4, list, unionId, sortedList4["fileId"]);
}
else
{
DingPanPo dingPanPoByID2 = this.dingPanRepository.GetDingPanPoByID(sortedList4["fileId"]);
bool flag6 = dingPanPoByID2 == null;
if (!flag6)
{
break;
}
list7.Add(new SortedList<string, string>
{
{
"fileId",
sortedList4["fileId"]
}
});
}
}
bool flag7 = list == null;
if (flag7)
{
list = list7;
}
else
{
list.AddRange(list7);
}
bool flag8 = text4 == null || text4 == "";
if (flag8)
{
result = list;
}
else
{
List<SortedList<string, string>> list8 = new List<SortedList<string, string>>();
list8 = this.GetFileList2(spaceId, accessToken, text4, list, unionId, null);
result = list8;
}
}
return result;
}