using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web;
using System.Web.Http;
using System.Web.Http.Results;
using System.IO;
using MongoDB.Bson;
using MongoDB.Driver;
using Newtonsoft.Json.Linq;
using ShadowEditor.Server.Base;
using ShadowEditor.Server.Helpers;
namespace ShadowEditor.Server.Controllers.Tools
{
///
/// 整理贴图控制器
///
public class ArrangeMapController : ApiBase
{
///
/// 开始执行
///
///
[HttpPost]
public JsonResult Run()
{
var texturePath = HttpContext.Current.Server.MapPath($"~/Upload/Texture");
// 创建临时目录
var now = DateTime.Now;
var path = HttpContext.Current.Server.MapPath($"~/Upload/Texture{now.ToString("yyyyMMddHHmmss")}");
if (!Directory.Exists(path))
{
Directory.CreateDirectory(path);
}
// 备份贴图数据表,并清空原数据表
var mongo = new MongoHelper();
var docs = mongo.FindAll(Constant.MapCollectionName).ToList();
if (docs.Count > 0)
{
mongo.InsertMany($"{Constant.MapCollectionName}{now.ToString("yyyyMMddHHmmss")}", docs);
}
mongo.DeleteAll(Constant.MapCollectionName);
// 读取贴图数据表,将文件完美复制到临时目录
for (var i = 0; i < docs.Count; i++)
{
var doc = docs[i];
// 更新名称
var name = doc["Name"].ToString();
name = StringHelper.RemoveEndNumbersAnd_(name);
var pinyin = PinYinHelper.GetTotalPinYin(name);
doc["Name"] = name;
doc["FirstPinYin"] = new BsonArray(pinyin.FirstPinYin);
doc["TotalPinYin"] = new BsonArray(pinyin.TotalPinYin);
// 处理Url,并复制文件
var urls = new List();
if (doc["Url"].IsString)
{
urls.Add(doc["Url"].ToString());
}
else
{
urls.Add(doc["Url"]["PosX"].ToString());
urls.Add(doc["Url"]["NegX"].ToString());
urls.Add(doc["Url"]["PosY"].ToString());
urls.Add(doc["Url"]["NegY"].ToString());
urls.Add(doc["Url"]["PosZ"].ToString());
urls.Add(doc["Url"]["NegZ"].ToString());
}
HandleUrl(urls.ToArray(), path, ref doc);
// 更新路径和时间
var createTime = doc["CreateTime"].ToUniversalTime();
var savePath = $"/Upload/Texture/{createTime.ToString("yyyyMMddHHmmss")}";
doc["SavePath"] = savePath.ToString();
doc["UpdateTime"] = DateTime.Now;
// 添加到Mongo数据表
mongo.InsertOne(Constant.MapCollectionName, doc);
}
// 交换正式目录和临时目录
Directory.Move(texturePath, path + "_temp");
Directory.Move(path, texturePath);
Directory.Move(path + "_temp", path);
// 移除贴图目录空文件夹
DirectoryHelper.RemoveEmptyDir(texturePath);
return Json(new
{
Code = 200,
Msg = "Execute sucessfully!"
});
}
///
/// 根据Url处理文件相关问题
///
///
///
///
///
private bool HandleUrl(string[] urls, string path, ref BsonDocument doc)
{
var createTime = doc["CreateTime"].ToUniversalTime();
var savePath = doc["SavePath"].ToString();
var fileSize = 0L;
var array = new BsonArray();
foreach (var url in urls)
{
if (string.IsNullOrEmpty(url))
{
continue;
}
if (!url.Contains("/"))
{
continue;
}
var names = url.Split('/');
var name = names[names.Length - 1];
array.Add($"/Upload/Texture/{createTime.ToString("yyyyMMddHHmmss")}/{name}");
var sourceFileName = HttpContext.Current.Server.MapPath($"~{url}");
if (File.Exists(sourceFileName))
{
var file = new FileInfo(sourceFileName);
fileSize += file.Length;
var destFileDir = $"{path}\\{createTime.ToString("yyyyMMddHHmmss")}";
if (!Directory.Exists(destFileDir))
{
Directory.CreateDirectory(destFileDir);
}
File.Copy(sourceFileName, $"{destFileDir}\\{name}", true);
}
//else
//{
// // TODO: 不小心把后缀写错了,待删除
// var sourceFileNameJpg = sourceFileName.Replace(".png", ".jpg");
// if (File.Exists(sourceFileNameJpg))
// {
// var file = new FileInfo(sourceFileNameJpg);
// fileSize += file.Length;
// var destFileDir = $"{path}\\{createTime.ToString("yyyyMMddHHmmss")}";
// if (!Directory.Exists(destFileDir))
// {
// Directory.CreateDirectory(destFileDir);
// }
// File.Copy(sourceFileNameJpg, $"{destFileDir}\\{name}");
// }
//}
}
doc["FileSize"] = fileSize;
if (array.Count > 1)
{
var obj = new BsonDocument
{
["PosX"] = array[0].ToString(),
["NegX"] = array[1].ToString(),
["PosY"] = array[2].ToString(),
["NegY"] = array[3].ToString(),
["PosZ"] = array[4].ToString(),
["NegZ"] = array[5].ToString(),
};
doc["Url"] = obj;
doc["Thumbnail"] = array[0].ToString();
}
else if (array.Count == 1)
{
doc["Url"] = array[0].ToString();
if (array[0].ToString().EndsWith("mp4"))
{
doc["Thumbnail"] = ""; // 视频贴图不要填写缩略图
}
else
{
doc["Thumbnail"] = array[0].ToString();
}
}
else // = 0
{
doc["Url"] = "";
doc["Thumbnail"] = "";
}
return true;
}
}
}