using System.Web; using JNPF.Common.Configuration; using JNPF.Common.Core.Manager.Files; using JNPF.Common.Enums; using JNPF.Common.Extension; using JNPF.Common.Filter; using JNPF.Common.Options; using JNPF.DependencyInjection; using JNPF.DynamicApiController; using JNPF.Extend.Entitys.Dto.DocumentPreview; using JNPF.FriendlyException; using JNPF.Logging.Attributes; using Mapster; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Options; namespace JNPF.Extend; /// /// 文件预览 /// 版 本:V3.2 /// 版 权:拓通智联科技有限公司(http://www.tuotong-tech.com) /// 日 期:2021-06-01 . /// [ApiDescriptionSettings(Tag = "Extend", Name = "DocumentPreview", Order = 600)] [Route("api/extend/[controller]")] public class DocumentPreview : IDynamicApiController, ITransient { private readonly IFileManager _fileManager; public DocumentPreview(IFileManager fileManager) { _fileManager = fileManager; } #region Get /// /// 获取文档列表. /// /// 请求参数. /// [HttpGet("")] public async Task GetList_Api([FromQuery] KeywordInput input) { var filePath = FileVariable.DocumentPreviewFilePath; var list = await _fileManager.GetObjList(filePath); list = list.FindAll(x => "xlsx".Equals(x.FileType) || "xls".Equals(x.FileType) || "docx".Equals(x.FileType) || "doc".Equals(x.FileType) || "pptx".Equals(x.FileType) || "ppt".Equals(x.FileType)); if (input.keyword.IsNotEmptyOrNull()) list = list.FindAll(x => x.FileName.Contains(input.keyword)); return list.OrderByDescending(x => x.FileTime).Adapt>(); } /// /// 文件在线预览. /// /// /// /// [HttpGet("{fileId}/Preview")] public async Task DocumentPreview_Api(string fileId, [FromQuery] DocumentPreviewPreviewInput input) { var filePath = FileVariable.DocumentPreviewFilePath; var files = await _fileManager.GetObjList(filePath); var file = files.Find(x => x.FileId == fileId); if (file.IsNotEmptyOrNull()) { string domain = App.GetConfig("JNPF_App", true).Domain; string yozoUrl = App.GetConfig("JNPF_App", true).YOZO.Domain; string yozoKey = App.GetConfig("JNPF_App", true).YOZO.domainKey; var url = string.Format("{0}/api/Extend/DocumentPreview/down/{1}", domain, file.FileName); if (!input.previewType.Equals("localPreview")) { url = string.Format("{0}?k={1}&url={2}", yozoUrl, yozoKey, url, input.noCache, input.watermark, input.isCopy, input.pageStart, input.pageEnd, input.type); } return url; } else { throw Oops.Oh(ErrorCode.D8000); } } /// /// 下载. /// /// [HttpGet("down/{fileName}")] [IgnoreLog] [AllowAnonymous] public async Task FileDown(string fileName) { var filePath = Path.Combine(FileVariable.DocumentPreviewFilePath, fileName); var systemFilePath = Path.Combine(FileVariable.SystemFilePath, fileName); FileStreamResult fileStreamResult = null; if (await _fileManager.ExistsFile(filePath)) fileStreamResult = await _fileManager.DownloadFileByType(filePath, fileName); else fileStreamResult = await _fileManager.DownloadFileByType(systemFilePath, fileName); byte[] bytes = new byte[fileStreamResult.FileStream.Length]; fileStreamResult.FileStream.Read(bytes, 0, bytes.Length); fileStreamResult.FileStream.Close(); var httpContext = App.HttpContext; httpContext.Response.ContentType = "application/octet-stream"; httpContext.Response.Headers.Add("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8)); httpContext.Response.Headers.Add("Content-Length", bytes.Length.ToString()); httpContext.Response.Body.WriteAsync(bytes); httpContext.Response.Body.Flush(); httpContext.Response.Body.Close(); } #endregion }