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;
using System.Text;
namespace ShadowEditor.Server.Controllers.Tools
{
///
/// 整理缩略图控制器
///
public class ArrangeThumbnailController : ApiBase
{
///
/// 开始执行
///
///
[HttpPost]
public JsonResult Run()
{
var filePath = HttpContext.Current.Server.MapPath($"~/Upload/File");
// 创建临时目录
var now = DateTime.Now;
var path = HttpContext.Current.Server.MapPath($"~/Upload/File{now.ToString("yyyyMMddHHmmss")}");
if (!Directory.Exists(path))
{
Directory.CreateDirectory(path);
}
// 备份每个存在的数据表,并重新生成缩略图Url
var collectionNames = new string[] {
Constant.SceneCollectionName, Constant.MeshCollectionName, Constant.MapCollectionName,
Constant.MaterialCollectionName, Constant.AudioCollectionName, Constant.AnimationCollectionName,
Constant.ParticleCollectionName, Constant.PrefabCollectionName, Constant.CharacterCollectionName
};
var mongo = new MongoHelper();
var mongoCollectionNames = mongo.ListCollections().ToList().Select(n => n["name"].ToString()).ToList();
// 备份附件表
var files = mongo.FindAll(Constant.FileCollectionName).ToList();
if (files.Count > 0)
{
mongo.InsertMany($"{Constant.FileCollectionName}{now.ToString("yyyyMMddHHmmss")}", files);
}
mongo.DeleteAll(Constant.FileCollectionName);
foreach (var i in collectionNames)
{
if (!mongoCollectionNames.Contains(i)) // Mongo中没有该数据表
{
continue;
}
// 备份数据表
var docs = mongo.FindAll(i).ToList();
if (docs.Count > 0)
{
mongo.InsertMany($"{i}{now.ToString("yyyyMMddHHmmss")}", docs);
}
// 重新生成缩略图路径,并复制文件
// 生成规则:优先采用File表中的时间;如果没有从now开始,每秒创建一个文件夹,存放缩略图
for (var j = 0; j < docs.Count; j++)
{
var doc = docs[j];
if (!doc.Contains("Thumbnail") || doc["Thumbnail"].IsBsonNull || doc["Thumbnail"].ToString().Trim() == "")
{
// 未设置缩略图
continue;
}
var url = doc["Thumbnail"].ToString();
var time = now;
var file = files.Where(n => n.Contains("Url") && !n["Url"].IsBsonNull && n["Url"].ToString() == url).FirstOrDefault();
if (file != null && file.Contains("AddTime"))
{
time = file["AddTime"].ToUniversalTime();
}
else
{
now = now.AddSeconds(1);
}
// 拷贝文件并记录信息
var sourceFileName = HttpContext.Current.Server.MapPath($"~{url}");
var fileSize = 0L;
var fileNames = url.Split('/');
var fileName = fileNames.Length > 0 ? fileNames[fileNames.Length - 1] : "";
// 复制文件
if (File.Exists(sourceFileName))
{
fileSize = new FileInfo(sourceFileName).Length;
var destFileDir = $"{path}\\{time.ToString("yyyyMMddHHmmss")}";
if (!Directory.Exists(destFileDir))
{
Directory.CreateDirectory(destFileDir);
}
File.Copy(sourceFileName, $"{destFileDir}\\{fileName}", true);
url = $"/Upload/File/{time.ToString("yyyyMMddHHmmss")}/{fileName}";
}
else // 附件不存在
{
url = "";
}
// 更新数据表信息
var filter = Builders.Filter.Eq("_id", doc["_id"].AsObjectId);
var update = Builders.Update.Set("Thumbnail", url);
mongo.UpdateOne(i, filter, update);
// 更新附件表信息
var fileNameWithoutExt = fileName;
var index = fileNameWithoutExt.LastIndexOf(".");
if (index > -1)
{
fileNameWithoutExt = fileNameWithoutExt.Substring(0, index);
}
var pinyin = PinYinHelper.GetTotalPinYin(fileName);
// 添加附件信息(由于附件表已经清空,只能添加)
file = new BsonDocument
{
["AddTime"] = DateTime.Now,
["FileName"] = fileName,
["FileSize"] = fileSize,
["FileType"] = fileName.EndsWith("png") ? "image/png" : "image/jpeg",
["FirstPinYin"] = new BsonArray(pinyin.FirstPinYin),
["Name"] = fileNameWithoutExt,
["SaveName"] = fileName,
["SavePath"] = $"/Upload/File/{time.ToString("yyyyMMddHHmmss")}",
["Thumbnail"] = url,
["TotalPinYin"] = new BsonArray(pinyin.TotalPinYin),
["Url"] = url
};
mongo.InsertOne(Constant.FileCollectionName, file);
}
}
// 交换正式目录和临时目录
Directory.Move(filePath, path + "_temp");
Directory.Move(path, filePath);
Directory.Move(path + "_temp", path);
// 移除缩略图目录空文件夹
DirectoryHelper.RemoveEmptyDir(filePath);
return Json(new
{
Code = 200,
Msg = "Execute sucessfully!"
});
}
}
}