using DocumentFormat.OpenXml.Packaging;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using PdfSharpCore.Pdf;
using PdfSharpCore.Pdf.IO;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using System.Xml;
using System.Xml.Linq;
using TEAMModelOS.SDK.Context.Configuration;
using TEAMModelOS.SDK.Context.Constant;
using TEAMModelOS.SDK.Context.Constant.Common;
using TEAMModelOS.SDK.Context.Exception;
using TEAMModelOS.SDK.Extension.DataResult.JsonRpcRequest;
using TEAMModelOS.SDK.Extension.DataResult.JsonRpcResponse;
using TEAMModelOS.SDK.Helper.Common.StringHelper;
using TEAMModelOS.SDK.Helper.Security.ShaHash;
using TEAMModelOS.SDK.Module.AzureBlob.Container;
namespace HiTeachCE.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class FileController
{
static XmlNamespaceManager xmlnsManager;
static FileController()
{
xmlnsManager = new XmlNamespaceManager(new NameTable());
xmlnsManager.AddNamespace("p", "http://schemas.openxmlformats.org/presentationml/2006/main");
xmlnsManager.AddNamespace("a", "http://schemas.openxmlformats.org/drawingml/2006/main");
xmlnsManager.AddNamespace("xsl", "http://www.w3.org/1999/XSL/Transform");
xmlnsManager.AddNamespace("fo", "http://www.w3.org/1999/XSL/Format");
xmlnsManager.AddNamespace("app", "http://schemas.openxmlformats.org/officeDocument/2006/extended-properties");
xmlnsManager.AddNamespace("cp", "http://schemas.openxmlformats.org/package/2006/metadata/core-properties");
xmlnsManager.AddNamespace("dc", "http://purl.org/dc/elements/1.1/");
xmlnsManager.AddNamespace("dcterms", "http://purl.org/dc/terms/");
xmlnsManager.AddNamespace("dcmitype", "http://purl.org/dc/dcmitype/");
xmlnsManager.AddNamespace("rel", "http://schemas.openxmlformats.org/package/2006/relationships");
xmlnsManager.AddNamespace("r", "http://schemas.openxmlformats.org/officeDocument/2006/relationships");
xmlnsManager.AddNamespace("cus", "http://schemas.openxmlformats.org/officeDocument/2006/custom-properties");
xmlnsManager.AddNamespace("vt", "http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes");
xmlnsManager.AddNamespace("pic", "http://schemas.openxmlformats.org/drawingml/2006/picture");
xmlnsManager.AddNamespace("dsp", "http://schemas.microsoft.com/office/drawing/2008/diagram");
xmlnsManager.AddNamespace("dgm", "http://schemas.openxmlformats.org/drawingml/2006/diagram");
xmlnsManager.AddNamespace("a14", "http://schemas.microsoft.com/office/drawing/2010/main");
xmlnsManager.AddNamespace("m", "http://schemas.openxmlformats.org/officeDocument/2006/math");
xmlnsManager.AddNamespace("mc", "http://schemas.openxmlformats.org/markup-compatibility/2006");
xmlnsManager.AddNamespace("p14", "http://schemas.microsoft.com/office/powerpoint/2010/main");
xmlnsManager.AddNamespace("pkg", "http://schemas.microsoft.com/office/2006/xmlPackage");
xmlnsManager.AddNamespace("p15", "http://schemas.microsoft.com/office/powerpoint/2012/main");
xmlnsManager.AddNamespace("a16", "http://schemas.microsoft.com/office/drawing/2014/main");
xmlnsManager.AddNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance");
xmlnsManager.AddNamespace("c", "http://schemas.openxmlformats.org/drawingml/2006/chart");
xmlnsManager.AddNamespace("c14", "http://schemas.microsoft.com/office/drawing/2007/8/2/chart");
xmlnsManager.AddNamespace("c16", "http://schemas.microsoft.com/office/drawing/2014/chart");
xmlnsManager.AddNamespace("cs", "http://schemas.microsoft.com/office/drawing/2012/chartStyle");
xmlnsManager.AddNamespace("thm15", "http://schemas.microsoft.com/office/thememl/2012/main");
xmlnsManager.AddNamespace("fn", "http://www.w3.org/2005/xpath-functions");
}
///
///
///
///
[HttpPost("upload")]
[RequestSizeLimit(102_400_000_00)] //最大10000m左右
public async Task upload([FromForm] IFormFile file)
{
//if (!IsImage(file.OpenReadStream())) {
// throw new BizException("请上传图片类型的文件!", 2);
//}
JsonRPCResponseBuilder responseBuilder = new JsonRPCResponseBuilder();
string filname = ShaHashHelper.GetSHA1(file.OpenReadStream());
string extension = System.IO.Path.GetExtension(file.FileName).ToLower();
// Dictionary model = await fileService.UploadDocument(file);
string path = BaseConfigModel.ContentRootPath + "/Avatar/" + filname + extension;
if (System.IO.File.Exists(path) == false)
{
using (var stream = new FileStream(path, FileMode.Create))
{
await file.CopyToAsync(stream);
}
}
var url = "https://cdhabook.teammodel.cn/avatar/" + filname + extension;
return responseBuilder.Data(url).build();
}
[HttpPost("uploadBase64")]
public async Task BlobSaveBase64(JosnRPCRequest files)
{
string filname = ShaHashHelper.GetSHA1(files.@params);
JsonRPCResponseBuilder responseBuilder = new JsonRPCResponseBuilder();
string[] strs = files.@params.Split(',');
string fileExt = StringHelper.SubMidString(strs[0], ":", ";");
if (ContentTypeDict.extdict.TryGetValue(fileExt, out string ext))
{
fileExt = ext;
}
else
{
//解决多种扩展名不能获取的
string[] sp = StringHelper.SubMidString(strs[0], "/", ";").Split("-");
fileExt = sp[sp.Length - 1];
sp = fileExt.Split("+");
fileExt = "." + sp[sp.Length - 1];
}
string path = BaseConfigModel.ContentRootPath + "/Avatar/" + filname + fileExt;
if (System.IO.File.Exists(path) == false)
{
FileStream fs = new FileStream(path, FileMode.Create);
BinaryWriter bw = new BinaryWriter(fs);
bw.Write(Convert.FromBase64String(strs[1]));
bw.Close();
fs.Close();
}
var url = "https://cdhabook.teammodel.cn/avatar/" + filname + fileExt;
return responseBuilder.Data(url).build();
}
///
/// docUrl
/// folder
/// shaCode
///
///
///
[HttpPost("uploadDocument")]
[RequestSizeLimit(102_400_000_00)] //最大10000m左右
public async Task UploadDocument([FromForm] IFormFile file)
{
Dictionary resdict = new Dictionary();
string contentRootPath = BaseConfigModel.ContentRootPath;
JsonRPCResponseBuilder responseBuilder = new JsonRPCResponseBuilder();
XmlDocument xmlDocument = new XmlDocument();
string path = contentRootPath + "/OfficeFile/";
string filname = ShaHashHelper.GetSHA1(file.OpenReadStream());
string extension = System.IO.Path.GetExtension(file.FileName).ToLower();
if (extension.Equals(".ppt") || extension.Equals(".doc") || extension.Equals(".pptx") || extension.Equals(".docx"))
{
if (System.IO.File.Exists(path + filname + ".pdf") == false)
{
//Console.WriteLine(filname + " Not Exists!");
//if (extension.Equals(".ppt") || extension.Equals(".doc") || extension.Equals(".pptx") || extension.Equals(".docx"))
//{
//}
//else
//{
// throw new BizException("file type does not support!", 500);
//}
if (extension.Equals(".pptx"))
{
using (PresentationDocument presentationDocument = PresentationDocument.Open(file.OpenReadStream(), false))
{
if (presentationDocument == null)
{
throw new ArgumentNullException("presentationDocument");
}
XDocument xdoc = presentationDocument.ToFlatOpcDocument();
xmlDocument.LoadXml(xdoc.ToString());
XmlNodeList xmlNodeList = xmlDocument.SelectNodes(@"//mc:Fallback", xmlnsManager);
foreach (XmlNode nodeChild in xmlNodeList)
{
nodeChild.ParentNode.RemoveChild(nodeChild);
}
XmlNodeList xmlNodeListMp4 = xmlDocument.SelectNodes(@"//pkg:part[@pkg:contentType='video/mp4']", xmlnsManager);
XmlDocument document = new XmlDocument();
foreach (XmlNode nodeChild in xmlNodeListMp4)
{
throw new BizException("Please delete the video!/请删除视频再重新上传!", 1001);
}
XmlNodeList xmlNodeListMp3 = xmlDocument.SelectNodes(@"//pkg:part[@pkg:contentType='audio/mpeg']", xmlnsManager);
foreach (XmlNode nodeChild in xmlNodeListMp3)
{
throw new BizException("Please delete the audio!/请删除音频再重新上传!", 1001);
}
var node = xmlDocument.Clone().OuterXml;
XDocument xdocs = XDocument.Parse(node);
presentationDocument.Dispose();
using (PresentationDocument presentationDocumen1t = PresentationDocument.FromFlatOpcDocument(xdocs))
{
presentationDocumen1t.SaveAs(path + filname + ".pptx");
presentationDocumen1t.Dispose();
}
}
OnWork(path + filname + ".pptx");
}
else
{
Stream sourceStream = file.OpenReadStream();
OnWork(sourceStream, path + filname + extension);
}
}
//else { Console.WriteLine(filname + " Exists!"); }
}
else if (extension.Equals(".pdf"))
{
if (System.IO.File.Exists(path + filname + ".pdf") == false)
{
//// pdf
string pathpdf = path + filname + ".pdf";
using (var stream = new FileStream(pathpdf, FileMode.Create))
{
await file.CopyToAsync(stream);
}
/////
}
}
else {
throw new BizException("不支持的文件类型!",2);
}
PdfDocument inputDocument = PdfSharpCore.Pdf.IO.PdfReader.Open(path + filname + ".pdf", PdfDocumentOpenMode.Import);
int count = inputDocument.PageCount;
int limit = BaseConfigModel.Configuration.GetSection("PDFLimit").Get();
if (count > limit)
{
throw new BizException("PDF file cannot exceed " + limit + " pages!", 500);
}
//await ProcessPDF(file, resdict);
resdict.Add("page", count);
resdict.Add("type", "pdf");
resdict.Add("model", new AzureBlobModel()
{
Folder = "OfficeFile",
Sha1Code = filname,
BlobUrl = "http://cdhabook.teammodel.cn/pdf/" + filname + ".pdf",
ContentType = "application/pdf",
ContentDisposition = "form-data; name=\"file\"; filename=\"" + filname + ".pdf\"",
Length = inputDocument.FileSize,
Name = "file",
FileName = filname + ".pdf",
RealName = "OfficeFile/" + filname + ".pdf",
UploadTime = DateTime.Now.ToUniversalTime().Ticks - 621355968000000000,
Extension = "pdf"
});
return responseBuilder.Data(resdict).build();
}
private bool SaveToFile(Stream stream, string path)
{
try
{
byte[] sourceBuffer = new Byte[stream.Length];
stream.Read(sourceBuffer, 0, sourceBuffer.Length);
stream.Seek(0, SeekOrigin.Begin);
using (FileStream fs = new FileStream(path, FileMode.Create, FileAccess.Write))
{
fs.Write(sourceBuffer, 0, sourceBuffer.Length);
fs.Close();
}
}
catch (Exception ex)
{
Console.WriteLine("读取PPT源文件到本地失败:" + ex.Message);
return false;
}
return true;
}
public bool OnWork(Stream stream, string path)
{
string sourcePath = string.Empty;
string destPath = string.Empty;
try
{
//if (FileInfo == null)
// return false;
// Stream sourceStream = FileInfo.OpenReadStream();
// string filename = FileInfo.FileName;
// string extension = System.IO.Path.GetExtension(FileInfo.FileName);
// sourcePath = System.IO.Path.Combine(Directory.GetCurrentDirectory(), filename + extension);
//destPath = System.IO.Path.Combine(Directory.GetCurrentDirectory(), string.Format("{0}.pdf", filename));
if (!SaveToFile(stream, path))
{
return false;
}
var psi = new ProcessStartInfo("libreoffice", string.Format(" --headless --invisible --convert-to pdf {0} --outdir /www/apps/HiTeachCE/OfficeFile/", path)) { RedirectStandardOutput = true };
Console.WriteLine(path);
// psi = new ProcessStartInfo("pptx2pdf ", "/www/apps/pptx2pdf/OfficeFile/5e4df6b8-6fbf-4de0-9c94-8de4b5604e45.pptx") { RedirectStandardOutput = true };
// 启动
var proc = Process.Start(psi);
if (proc == null)
{
Console.WriteLine("不能执行.");
return false;
}
else
{
Console.WriteLine("-------------开始执行--------------");
//开始读取
using (var sr = proc.StandardOutput)
{
while (!sr.EndOfStream)
{
Console.WriteLine(sr.ReadLine());
}
if (!proc.HasExited)
{
proc.Kill();
}
}
Console.WriteLine("---------------执行完成------------------");
Console.WriteLine($"退出代码 : {proc.ExitCode}");
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
return false;
}
finally
{
//if (System.IO. File.Exists(destPath))
//{
// var destFileInfo = UploadFile(destPath, string.Format("{0}.pdf", Path.GetFileNameWithoutExtension( FileInfo.FileName)));
//}
//if (System.IO.File.Exists(destPath))
//{
// System.IO.File.Delete(destPath);
//}
}
return true;
}
public bool OnWork(string path)
{
// string sourcePath = string.Empty;
// string destPath = string.Empty;
try
{
//if (FileInfo == null)
// return false;
// Stream sourceStream = FileInfo.OpenReadStream();
// string filename = FileInfo.FileName;
// string extension = System.IO.Path.GetExtension(FileInfo.FileName);
// sourcePath = System.IO.Path.Combine(Directory.GetCurrentDirectory(), filename + extension);
//destPath = System.IO.Path.Combine(Directory.GetCurrentDirectory(), string.Format("{0}.pdf", filename));
//if (!SaveToFile(sourceStream, sourcePath))
// return false;
var psi = new ProcessStartInfo("libreoffice", string.Format(" --headless --invisible --convert-to pdf {0} --outdir /www/apps/HiTeachCE/OfficeFile/", path)) { RedirectStandardOutput = true };
Console.WriteLine(path);
// psi = new ProcessStartInfo("pptx2pdf ", "/www/apps/pptx2pdf/OfficeFile/5e4df6b8-6fbf-4de0-9c94-8de4b5604e45.pptx") { RedirectStandardOutput = true };
// 启动
var proc = Process.Start(psi);
if (proc == null)
{
Console.WriteLine("不能执行.");
return false;
}
else
{
Console.WriteLine("-------------开始执行--------------");
//开始读取
using (var sr = proc.StandardOutput)
{
while (!sr.EndOfStream)
{
Console.WriteLine(sr.ReadLine());
}
if (!proc.HasExited)
{
proc.Kill();
}
}
Console.WriteLine("---------------执行完成------------------");
Console.WriteLine($"退出代码 : {proc.ExitCode}");
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
return false;
}
finally
{
//if (System.IO. File.Exists(destPath))
//{
// var destFileInfo = UploadFile(destPath, string.Format("{0}.pdf", Path.GetFileNameWithoutExtension( FileInfo.FileName)));
//}
//if (System.IO.File.Exists(destPath))
//{
// System.IO.File.Delete(destPath);
//}
}
return true;
}
}
}