/// <summary>生成HTML</summary> private async Task <string> GenerateHtmlAsync(UploadFileContext context) { string destFile = null; if (context.UploadFileDoc.HtmlFileId.IsNullOrEmpty()) { var ext = context.UploadFileFormat.Ext.First(); var converter = GetFileFormatConverters(ext).HtmlConverter; var sourceFile = context.UploadFileDoc.RelativePath; var newFileName = Path.GetFileNameWithoutExtension(sourceFile) + "." + converter.NewExt; var newFileDoc = this.UploadFileHandler.BeginBuild(newFileName, Encoding.UTF8.WebName); sourceFile = this.UploadFileHandler.UploadPath + sourceFile; destFile = this.UploadFileHandler.UploadPath + newFileDoc.RelativePath; var success = await converter.ExecuteAsync(sourceFile, destFile); await this.UploadFileHandler.EndBuild(success, FileConvertType.Html, newFileDoc, context.UploadFileDoc, null); } else { var newFileDoc = await this.UploadFileHandler.GetAsync(context.UploadFileDoc.HtmlFileId); destFile = this.UploadFileHandler.UploadPath + newFileDoc.RelativePath; } return(File.ReadAllText(destFile, Encoding.UTF8)); }
/// <summary>生成全文</summary> private async Task <string> GenerateFulltextAsync(UploadFileContext context) { if (!context.UploadFileDoc.FullTextFileId.IsNullOrEmpty()) { return(context.UploadFileDoc.FullTextFileId); } var ext = context.UploadFileFormat.Ext.First(); var converter = GetFileFormatConverters(ext).FulltextConverter; var sourceFile = context.UploadFileDoc.RelativePath; var newFileName = Path.GetFileNameWithoutExtension(sourceFile) + "." + converter.NewExt; var newFileDoc = this.UploadFileHandler.BeginBuild(newFileName, Encoding.UTF8.WebName); sourceFile = this.UploadFileHandler.UploadPath + sourceFile; string pdfFile = null; if (context.UploadFileDoc != context.NormalizedFileDoc) { pdfFile = this.UploadFileHandler.UploadPath + context.NormalizedFileDoc.RelativePath; } var destFile = this.UploadFileHandler.UploadPath + newFileDoc.RelativePath; var success = await converter.ExecuteAsync(sourceFile, pdfFile, destFile); await this.UploadFileHandler.EndBuild(success, FileConvertType.FullText, newFileDoc, context.UploadFileDoc, context.NormalizedFileDoc); if (!success) { newFileDoc = context.NormalizedFileDoc; } return(newFileDoc.FileId); }
/// <summary>生成文本文件内容</summary> private string BuildContent(UploadFileContext context) { var fileDoc = context.UploadFileDoc; var file = this.UploadFileHandler.UploadPath + fileDoc.RelativePath; return(File.ReadAllText(file, Encoding.UTF8)); }
/// <summary>生成图片</summary> private async Task GenerateImageAsync(UploadFileContext context) { if (context.UploadFileDoc.FileId == context.UploadFileDoc.ImageFileId) { context.NormalizedFileDoc = context.UploadFileDoc; return; } if (!context.UploadFileDoc.ImageFileId.IsNullOrEmpty()) { var newFileId = context.UploadFileDoc.ImageFileId; context.NormalizedFileDoc = await this.UploadFileHandler.GetAsync(newFileId); return; } var ext = context.UploadFileFormat.Ext.First(); var converter = GetFileFormatConverters(ext).ImageConverter; var sourceFile = context.UploadFileDoc.RelativePath; var newFileName = Path.GetFileNameWithoutExtension(sourceFile) + "." + converter.NewExt; var newFileDoc = this.UploadFileHandler.BeginBuild(newFileName); sourceFile = this.UploadFileHandler.UploadPath + sourceFile; var destFile = this.UploadFileHandler.UploadPath + newFileDoc.RelativePath; var success = await converter.ExecuteAsync(sourceFile, destFile); await this.UploadFileHandler.EndBuild(success, FileConvertType.Image, newFileDoc, context.UploadFileDoc, null); context.NormalizedFileDoc = newFileDoc; }
/// <summary>生成URL方式的数据</summary> private async Task BuildUrl(TDocument doc, UploadFileContext context) { doc.SourceName = context.UploadFileDoc.FileName; doc.SourceStorageType = IndexStorageType.Url; doc.SourceContentRef = context.UploadFileDoc.RelativePath.Replace('\\', '/'); await BuildUploadFile(doc, context); }
/// <summary>生成上传文件相关的数据</summary> private async Task BuildUploadFile(TDocument doc, UploadFileContext context) { context.UploadFileFormat = Path.GetExtension(context.UploadFileDoc.FileName).GetFileFormat(); if (context.UploadFileFormat.GeneratePdf) { await GeneratePdfAsync(context); } else if (context.UploadFileFormat.GenerateImage) { await GenerateImageAsync(context); } else { context.NormalizedFileDoc = context.UploadFileDoc; } if (doc.Name.IsNullOrEmpty()) { doc.Name = context.NormalizedFileDoc.FileName; } if (context.NormalizedFileDoc == context.UploadFileDoc) { doc.StorageType = doc.SourceStorageType.Value; doc.ContentRef = doc.SourceContentRef; context.NormalizedFileFormat = context.UploadFileFormat; } else { if (doc.SourceStorageType.Value == IndexStorageType.File) { var fileObjectId = await this.UploadFileHandler.InsertMongoAsync(context.NormalizedFileDoc); doc.StorageType = IndexStorageType.File; doc.ContentRef = fileObjectId.ToString(); } else { doc.StorageType = IndexStorageType.Url; doc.ContentRef = context.NormalizedFileDoc.RelativePath.Replace('\\', '/'); } context.NormalizedFileFormat = Path.GetExtension(context.NormalizedFileDoc.FileName).GetFileFormat(); } doc.DataType = context.NormalizedFileFormat.AppDataType.ToEnum <IndexAppDataType>(); }
/// <summary>生成缩略图</summary> private async Task <string> GenerateThumbnailAsync(UploadFileContext context) { string ext = null; string sourceFile = null; if (context.NormalizedFileDoc != context.UploadFileDoc) { if (!context.NormalizedFileDoc.ThumbnailFileId.IsNullOrEmpty()) { return(context.NormalizedFileDoc.ThumbnailFileId); } if (context.NormalizedFileFormat.GenerateThumbnail) { ext = context.NormalizedFileFormat.Ext.First(); sourceFile = context.NormalizedFileDoc.RelativePath; } } if (!context.UploadFileDoc.ThumbnailFileId.IsNullOrEmpty()) { return(context.UploadFileDoc.ThumbnailFileId); } if (ext == null) { ext = context.UploadFileFormat.Ext.First(); sourceFile = context.UploadFileDoc.RelativePath; } var converter = GetFileFormatConverters(ext).ThumbnailConverter; var newFileName = Path.GetFileNameWithoutExtension(sourceFile) + "." + converter.NewExt; var newFileDoc = this.UploadFileHandler.BeginBuild(newFileName); sourceFile = this.UploadFileHandler.UploadPath + sourceFile; var destFile = this.UploadFileHandler.UploadPath + newFileDoc.RelativePath; var success = await converter.ExecuteAsync(sourceFile, destFile); await this.UploadFileHandler.EndBuild(success, FileConvertType.Thumbnail, newFileDoc, context.UploadFileDoc, context.NormalizedFileDoc); if (!success) { newFileDoc = context.NormalizedFileDoc; } return(newFileDoc.FileId); }
/// <summary>验证</summary> private async Task <PKSKeyValuePair <TDocument, AppDataSaveResult> > Validate(AppDataSaveRequest request, bool replace) { #region 检查键 var doc = new TDocument(); IndexAppData oldDoc = null; if (request.DataId.IsNullOrEmpty()) { if (request.ResourceKey.IsNullOrEmpty()) { ApiServiceExceptionCodes.ResourceKeyNotExists.ThrowUserFriendly("缺少参数!", $"ResourceKey不存在!"); } request.DataId = request.ResourceKey.ToUpperInvariant().ToMD5(); } else { oldDoc = await Accessor.AsQueryable().FirstAsync(e => e.Id == request.DataId); } doc.Id = request.DataId; doc.DataId = request.DataId; doc.Name = request.Name; doc.IsOnline = false; #endregion var context = new UploadFileContext(); if (request.ContentType != IndexAppContentType.File) { #region 非文件应用数据 if (request.Content == null) { if (request.UploadFileId.IsNullOrEmpty()) { ExceptionCodes.MissingParameterValue.ThrowUserFriendly("缺少参数!", $"Content不存在!"); } context.UploadFileDoc = await this.UploadFileHandler.GetAsync(request.UploadFileId); doc.SourceName = context.UploadFileDoc.FileName; doc.SourceStorageType = IndexStorageType.Url; doc.SourceContentRef = context.UploadFileDoc.RelativePath.Replace('\\', '/'); context.UploadFileFormat = Path.GetExtension(context.UploadFileDoc.FileName).GetFileFormat(); } switch (request.ContentType) { case IndexAppContentType.Html: doc.DataType = IndexAppDataType.Html; if (context.UploadFileDoc != null) { if (context.UploadFileFormat.GenerateHtml) { request.Content = await GenerateHtmlAsync(context); } else { request.Content = BuildContent(context); } } break; case IndexAppContentType.Json: doc.DataType = IndexAppDataType.Json; if (context.UploadFileDoc != null) { var content = BuildContent(context); request.Content = content.JsonTo(); } break; default: ExceptionCodes.ParameterParsingFailed.ThrowUserFriendly("参数解析失败!", $"ContentType[{request.ContentType.ToString()}]值无效!"); break; } doc.StorageType = IndexStorageType.Content; doc.Content = JsonUtil.ToObject(request.Content); #endregion } else { #region 文件应用数据 if (request.StorageType == FileStorageType.FileSystem && !request.IsOnline) { if (request.SourceFile.IsNullOrEmpty()) { CopyFromOld(doc, oldDoc); } else { context.UploadFileDoc = await this.UploadFileHandler.OfflineUploadAsync(request.SourceFile); await BuildUrl(doc, context); } } else { if (request.UploadFileId.IsNullOrEmpty()) { CopyFromOld(doc, oldDoc); } else { doc.IsOnline = true; context.UploadFileDoc = await this.UploadFileHandler.GetAsync(request.UploadFileId); if (request.StorageType == FileStorageType.Mongo) { var fileObjectId = await this.UploadFileHandler.InsertMongoAsync(context.UploadFileDoc); doc.SourceStorageType = IndexStorageType.File; doc.SourceContentRef = fileObjectId.ToString(); await BuildUploadFile(doc, context); } else { if (!request.SourceFile.IsNullOrEmpty()) { await this.UploadFileHandler.OnlineUploadAsync(context.UploadFileDoc, request.SourceFile); } await BuildUrl(doc, context); } } } #endregion } #region 检查属性 if (!replace || oldDoc == null) { doc.CreateBy = request.Uploader; doc.CreateDate = DateTime.UtcNow; } else { doc.CreateBy = oldDoc.CreateBy; doc.CreateDate = oldDoc.CreateDate; } doc.LastUpdatedBy = request.Uploader; doc.LastUpdatedDate = DateTime.UtcNow; doc.RawAdapter = request.RawAdapter; doc.System = request.System; doc.ResourceType = request.ResourceType; doc.ResourceKey = request.ResourceKey; var pair = new PKSKeyValuePair <TDocument, AppDataSaveResult>(); pair.Key = doc; var result = new AppDataSaveResult(); result.DataId = doc.DataId; if (request.GenerateThumbnail && context.UploadFileDoc != null && context.UploadFileFormat.GenerateThumbnail) { result.Thumbnail = await GenerateThumbnailAsync(context); } if (request.GenerateFulltext && context.UploadFileDoc != null && context.UploadFileFormat.GenerateFulltext) { result.Fulltext = await GenerateFulltextAsync(context); } pair.Value = result; return(pair); #endregion }