This commit is contained in:
owenchen committed 2026-09-21 16:54:56 +08:00
1 parent 9e79a6a67c
commit 7c8af2fb08
14 files changed
+328 -45

No files matched your search

@@ -5,8 +5,6 @@ VisualStudioVersion = 17.8.34316.72
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CloudBuilder.Topshelf", "CloudBuilder.Topshelf.csproj", "{63EB47F6-A616-4C64-B850-85ED294E2524}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CloudBuilder.Request", "..\CloudBuilder\CloudBuilder.Request\CloudBuilder.Request.csproj", "{8A0A5461-7F04-B87A-CE03-309E1D186FEC}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -17,10 +15,6 @@ Global
{63EB47F6-A616-4C64-B850-85ED294E2524}.Debug|Any CPU.Build.0 = Debug|Any CPU
{63EB47F6-A616-4C64-B850-85ED294E2524}.Release|Any CPU.ActiveCfg = Release|Any CPU
{63EB47F6-A616-4C64-B850-85ED294E2524}.Release|Any CPU.Build.0 = Release|Any CPU
{8A0A5461-7F04-B87A-CE03-309E1D186FEC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{8A0A5461-7F04-B87A-CE03-309E1D186FEC}.Debug|Any CPU.Build.0 = Debug|Any CPU
{8A0A5461-7F04-B87A-CE03-309E1D186FEC}.Release|Any CPU.ActiveCfg = Release|Any CPU
{8A0A5461-7F04-B87A-CE03-309E1D186FEC}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
Binary file not shown.
@@ -2,7 +2,7 @@
<!-- https://go.microsoft.com/fwlink/?LinkID=208121. -->
<Project>
<PropertyGroup>
<History>True|2026-09-21T03:59:35.1020536Z||;True|2026-09-21T11:50:47.8944224+08:00||;True|2026-09-21T11:30:52.9019631+08:00||;True|2026-09-21T10:47:01.8026331+08:00||;</History>
<History>True|2026-09-21T07:29:51.3588778Z||;True|2026-09-21T15:18:10.5399306+08:00||;True|2026-09-21T14:59:51.6908938+08:00||;True|2026-09-21T14:49:11.2390264+08:00||;True|2026-09-21T14:17:57.4013084+08:00||;True|2026-09-21T14:00:14.9207890+08:00||;True|2026-09-21T11:59:35.1020536+08:00||;True|2026-09-21T11:50:47.8944224+08:00||;True|2026-09-21T11:30:52.9019631+08:00||;True|2026-09-21T10:47:01.8026331+08:00||;</History>
<LastFailureDetails />
</PropertyGroup>
</Project>
+63 -9
View File
@@ -1,6 +1,12 @@
using CloudBuilder.Core.DatabaseAccessor.Entity;
using CliWrap;
using CloudBuilder.Core.DatabaseAccessor.Entity;
using CloudBuilder.Core.DependencyInjection.Task;
using CloudBuilder.Core.Service;
using CloudBuilder.Master.Entity;
using CloudBuilder.Security.Entity;
using CloudBuilder.Security.Service;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
namespace CloudBuilder.Topshelf.Task
{
@@ -8,27 +14,75 @@ namespace CloudBuilder.Topshelf.Task
public class RunTask : IScheduleTask
{
private readonly IApplicationService service;
private readonly IConfiguration config;
private FileLog log;
public RunTask(IApplicationService service, IConfiguration config)
public RunTask(IApplicationService service)
{
this.service = service;
this.config = config;
log = new FileLog(service.Configuration);
}
public void Run(Dictionary<string, string> bodyDict)
{
File.AppendAllText("log.txt", "RunTask:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "\r\n");
log.WriteToFile("RunTask");
try
{
new FileLog(config).WriteToFile("RunTask");
IRepository<SecurityScheduleTaskQueueEntity> taskRepository = service.GetRepository<IRepository<SecurityScheduleTaskQueueEntity>>();
SecurityScheduleTaskQueueEntity task = taskRepository.DetachedEntities.OrderBy(x => x.QueueId).FirstOrDefault();
if (task == null) return;
IRepository<DmsFileEntity> repositoryDmsFile = service.GetRepository<IRepository<DmsFileEntity>>();
DmsFileEntity dmsFile = repositoryDmsFile.DetachedEntities.Where(x => x.OrderKey == task.DocumentId).FirstOrDefault();
if (dmsFile == null) return;
RunMyProcess(task.TaskId, task.TaskParam);
dmsFile.TranscodeIndc = YesNoPolicy.YES;
repositoryDmsFile.UpdateNow(dmsFile);
}
catch (Exception ex)
{
File.AppendAllText("log.txt", "RunTask:" + ex.Message);
throw;
log.WriteToFile(ex.Message);
}
}
/// <summary>
/// 执行cmd指令(异步不等待,await要求等待返回,转码太耗时)
/// </summary>
/// <param name="parameters"></param>
public void RunMyProcess(string exePath, string parameters)
{
try
{
parameters = parameters.Replace("/app/data", "/vol1/1000/Docker/NET8/DEV/data");
log.WriteToFile(exePath + parameters);
if (string.IsNullOrEmpty(exePath)) return;
// 获取异步任务
var commandTask = Cli.Wrap(exePath)
.WithArguments(parameters)
.WithValidation(CommandResultValidation.None) // 关键:允许非0退出码而不抛异常,以便我们能拿到错误输出
.ExecuteAsync();
// 阻塞当前线程,等待任务完成(因为你的外层是同步的 void 方法)
var result = commandTask.Task.GetAwaiter().GetResult();
// 记录退出码和标准错误输出
log.WriteToFile($"FFmpeg ExitCode: {result.ExitCode}");
}
catch (Exception ex)
{
log.WriteToFile(ex.Message);
throw new ValidatedException(ex.Message);
}
}
}
}
@@ -2,11 +2,13 @@
using CliWrap;
using CloudBuilder.Core.DatabaseAccessor;
using CloudBuilder.Core.DatabaseAccessor.Entity;
using CloudBuilder.Core.Extensions;
using CloudBuilder.Core.Service;
using CloudBuilder.Master.Data;
using CloudBuilder.Master.Entity;
using CloudBuilder.Master.Policy;
using CloudBuilder.Master.SearchCriteria;
using CloudBuilder.Security.Entity;
using CloudBuilder.Security.Policy;
using CloudBuilder.Security.Service;
using Microsoft.AspNetCore.Authorization;
@@ -92,7 +94,7 @@ namespace CloudBuilder.Master.Service
data.Datas = list.Select(x => new DmsFileUploadViewDisplayData(x)
{
FormattedPic = FileTypePolicy.PackUrl(service, x.CreatedBy, x.OrderKey, YesNoPolicy.YES)
FormattedPic = FileTypePolicy.PackPicUrl(service, x.CreatedBy, x.OrderKey)
}).ToArray();
}
@@ -160,7 +162,7 @@ namespace CloudBuilder.Master.Service
data.Datas = list.Select(x => new DmsFileUploadViewDisplayData(x)
{
FormattedPic = FileTypePolicy.PackUrl(service, x.CreatedBy, x.OrderKey, YesNoPolicy.YES)
FormattedPic = FileTypePolicy.PackPicUrl(service, x.CreatedBy, x.OrderKey)
}).ToArray();
}
@@ -224,7 +226,7 @@ namespace CloudBuilder.Master.Service
data.Logs = list.Select(x => new DmsFileUploadDeleteLogViewDisplayData(x)
{
FormattedPic = FileTypePolicy.PackUrl(service, x.CreatedBy, x.OrderKey, YesNoPolicy.YES)
FormattedPic = FileTypePolicy.PackPicUrl(service, x.CreatedBy, x.OrderKey)
}).ToArray();
}
@@ -325,7 +327,7 @@ namespace CloudBuilder.Master.Service
data.Families = list.Select(x => new FamilyDmsFileViewDisplayData(x)
{
FileType = FileTypePolicy.GetType(x.OrderKey),
FormattedPic = FileTypePolicy.PackUrl(service, x.CreatedBy, x.OrderKey, YesNoPolicy.YES)
FormattedPic = FileTypePolicy.PackPicUrl(service, x.CreatedBy, x.OrderKey)
}).ToArray();
}
@@ -1371,7 +1373,7 @@ namespace CloudBuilder.Master.Service
{
DmsFileEntity entity = repository.DetachedEntities.Where(x => x.FileId == fileId && x.CreatedBy == service.UserId).FirstOrDefault()!;
return FileTypePolicy.PackUrl(service, entity.CreatedBy, entity.OrderKey, entity.TranscodeIndc);
return FileTypePolicy.PackSourceVideoUrl(service, entity.CreatedBy, entity.OrderKey, entity.TranscodeIndc);
}
[PermissionOperate(name: MasterPermissionPolicy.DmsFile, operate: Operate.Find)]
@@ -1379,7 +1381,7 @@ namespace CloudBuilder.Master.Service
{
DmsFileEntity entity = repository.DetachedEntities.Where(x => x.FileId == fileId && x.CreatedBy == service.UserId).FirstOrDefault()!;
return FileTypePolicy.PackSourceVideoUrl(service, entity.CreatedBy, entity.OrderKey);
return FileTypePolicy.PackSourceVideoUrl(service, entity.CreatedBy, entity.OrderKey,entity.TranscodeIndc);
}
[PermissionOperate(name: MasterPermissionPolicy.DmsFile, operate: Operate.Find)]
@@ -1388,7 +1390,7 @@ namespace CloudBuilder.Master.Service
IRepository<DmsFileDeleteLogEntity> repositoryDmsFileDeleteLog = repository.GetRepository<IRepository<DmsFileDeleteLogEntity>>();
DmsFileDeleteLogEntity entity = repositoryDmsFileDeleteLog.DetachedEntities.Where(x => x.FileId == fileId && x.CreatedBy == service.UserId).FirstOrDefault()!;
return FileTypePolicy.PackSourceVideoUrl(service, entity.CreatedBy, entity.OrderKey);
return FileTypePolicy.PackSourceVideoUrl(service, entity.CreatedBy, entity.OrderKey,entity.TranscodeIndc);
}
private string PackParameters(DmsFileEntity dmsFile)
@@ -1402,7 +1404,7 @@ namespace CloudBuilder.Master.Service
return para.ToArray().ToDelimiteredList(' ');
}
public void TsToM3u8(string orderKey, string mp4Url, string m3u8Url, int videoLength = 6)
public void TsToM3u8(string documentId, string mp4Url, string m3u8Url, int videoLength = 6)
{
string para = string.Format(service.Configuration[ServiceSettingsPolicy.FfmpegPictrue], mp4Url, m3u8Url);
try
@@ -1413,21 +1415,37 @@ namespace CloudBuilder.Master.Service
{
new FileLog(service.Configuration).WriteToFile(ex.Message);
}
return;
para = string.Format(service.Configuration["Ffmpeg:Arguments"], mp4Url, videoLength, m3u8Url);
var backupRootPath = ServiceSettingsPolicy.GetDmsFileBackupDirectory(service);
var fileExtension = "m3u8";
var filePath = Path.Combine(service.UserId, fileExtension.Replace(".", ""), "");
var orgFileExtension = Path.GetExtension(documentId);
var fullName = Path.Combine(backupRootPath, filePath, documentId.Replace(orgFileExtension, ".m3u8"));
string targetDir = Path.GetDirectoryName(fullName);
if (!Directory.Exists(targetDir))
{
Directory.CreateDirectory(targetDir);
}
//return;
para = string.Format(service.Configuration["Ffmpeg:Arguments"], mp4Url, videoLength, fullName);
//不直接转码视频文件,影响服务器性能,改为在闭时自动生成
//Task.Run(() =>
//{
// Thread.Sleep(200);
// RunMyProcess(service.Configuration["Ffmpeg:Path"], para);
//});
//IRepository<VideoToM3u8LogEntity> logRepository = repository.GetRepository<IRepository<VideoToM3u8LogEntity>>();
//VideoToM3u8LogEntity log = new VideoToM3u8LogEntity();
//log.VideoName = para;
//log.FilePath = Path.GetDirectoryName(m3u8Url)!;
//log.OrderKey = orderKey;
//log.Status = "S";
//logRepository.InsertNow(log);
IRepository<SecurityScheduleTaskQueueEntity> logRepository = repository.GetRepository<IRepository<SecurityScheduleTaskQueueEntity>>();
SecurityScheduleTaskQueueEntity task = new SecurityScheduleTaskQueueEntity();
task.DocumentId = documentId;
task.TaskId = service.Configuration["Ffmpeg:Path"];
task.TaskParam = para;
logRepository.InsertNow(task);
}
public void ImageToScare(string fullName, DmsFileEntity dmsFile)
@@ -80,7 +80,7 @@ namespace CloudBuilder.Master.Service
{
if (!string.IsNullOrEmpty(item.Pic) && FileTypePolicy.GetType(item.Pic!) == FileTypePolicy.PHOTO)
{
item.FormattedPic = item.FormattedPic = FileTypePolicy.PackUrl(service, item.CreatedBy, item.Pic, YesNoPolicy.NO);
item.FormattedPic = item.FormattedPic = FileTypePolicy.PackPicUrl(service, item.CreatedBy, item.Pic);
}
if (!string.IsNullOrEmpty(item.Url) && FileTypePolicy.GetType(item.Url!) == FileTypePolicy.AUDIO)
{
@@ -90,7 +90,7 @@ namespace CloudBuilder.Master.Service
//暂时不支持转码
//DmsFileEntity dmsFileEntity = repositoryDmsFile.DetachedEntities.Where(x => x.OrderKey == item.Url).FirstOrDefault();
item.FormattedPic = FileTypePolicy.PackUrl(service, item.CreatedBy, item.Url, YesNoPolicy.YES);
item.FormattedPic = FileTypePolicy.PackPicUrl(service, item.CreatedBy, item.Url);
item.FormattedUrl = FileTypePolicy.PackUrl(service, item.CreatedBy, item.Url, YesNoPolicy.NO);
}
}
@@ -194,6 +194,8 @@ builder.Entity<SysTableSchemaViewEntity>(eb => { eb.HasNoKey(); });
//***END***
}
}
@@ -0,0 +1,184 @@
using CloudBuilder.Core.Authorization;
using CloudBuilder.Core.DatabaseAccessor.Entity;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace CloudBuilder.Security.Entity
{
[TypeScript]
[Table("security_schedule_task_queue")]
public class SecurityScheduleTaskQueueEntity : ViewEntityBase
{
public SecurityScheduleTaskQueueEntity()
{
}
[Column("created_by")]
public string CreatedBy { get; set; }
[Column("created_datetime")]
public DateTime CreatedDatetime { get; set; }
[Column("document_id")]
public string DocumentId { get; set; }
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[Column("queue_id")]
public int QueueId { get; set; }
[Column("task_id")]
public string TaskId { get; set; }
[Column("task_param")]
public string? TaskParam { get; set; }
[Column("updated_by")]
public string UpdatedBy { get; set; }
[Column("updated_datetime")]
public DateTime UpdatedDatetime { get; set; }
public const string CREATED_BY = "CreatedBy";
public const string CREATED_DATETIME = "CreatedDatetime";
public const string DOCUMENT_ID = "DocumentId";
public const string QUEUE_ID = "QueueId";
public const string TASK_ID = "TaskId";
public const string TASK_PARAM = "TaskParam";
public const string UPDATED_BY = "UpdatedBy";
public const string UPDATED_DATETIME = "UpdatedDatetime";
public const string DB_NAME_SECURITY_SCHEDULE_TASK_QUEUE = "security_schedule_task_queue";
public const string DB_NAME_FIELDS="created_by,created_datetime,document_id,queue_id,task_id,task_param,updated_by,updated_datetime";
public const string DB_CREATED_BY = "created_by";
public const string DB_CREATED_DATETIME = "created_datetime";
public const string DB_DOCUMENT_ID = "document_id";
public const string DB_QUEUE_ID = "queue_id";
public const string DB_TASK_ID = "task_id";
public const string DB_TASK_PARAM = "task_param";
public const string DB_UPDATED_BY = "updated_by";
public const string DB_UPDATED_DATETIME = "updated_datetime";
private string ProviderName { get; set; }
public static SecurityScheduleTaskQueueEntity GetInstance(string providerName)
{
return new SecurityScheduleTaskQueueEntity() { ProviderName = providerName };
}
public virtual void CopyFrom(SecurityScheduleTaskQueueEntity source)
{
CopyFrom(source, true);
}
public virtual void CopyFrom(SecurityScheduleTaskQueueEntity source, bool includeSystemFields)
{
if (source == null)
{
throw new NullReferenceException("Source entity is null.");
}
this.CreatedBy = source.CreatedBy;
this.CreatedDatetime = source.CreatedDatetime;
this.DocumentId = source.DocumentId;
this.QueueId = source.QueueId;
this.TaskId = source.TaskId;
this.TaskParam = source.TaskParam;
this.UpdatedBy = source.UpdatedBy;
this.UpdatedDatetime = source.UpdatedDatetime;
if (includeSystemFields)
{
this.CreatedBy = source.CreatedBy;
this.CreatedDatetime = source.CreatedDatetime;
this.UpdatedBy = source.UpdatedBy;
this.UpdatedDatetime = source.UpdatedDatetime;
}
}
public override string GetSelectFrom()
{
if (ProviderName.Contains("MySql"))
{
return GetSelectFromByMySql();
}
else if (ProviderName.Contains("SqlServer"))
{
return GetSelectFromByBySqlServer();
}
else
{
throw new NotSupportedException($"不支持的数据库提供程序:{ProviderName}");
}
}
public string GetSelectFromByMySql()
{
return $" select {DB_NAME_FIELDS} from { DB_NAME_SECURITY_SCHEDULE_TASK_QUEUE} with(nolock) ";
}
public string GetSelectFromByBySqlServer()
{
return $" select {DB_NAME_FIELDS} from { DB_NAME_SECURITY_SCHEDULE_TASK_QUEUE} ";
}
public override string GetSelectCountFrom(string sqlWhere)
{
if (ProviderName.Contains("MySql"))
{
return GetSelectCountFromByMySql(sqlWhere);
}
else if (ProviderName.Contains("SqlServer"))
{
return GetSelectCountFromBySqlServer(sqlWhere);
}
else
{
throw new NotSupportedException($"不支持的数据库提供程序:{ProviderName}");
}
}
public string GetSelectCountFromByMySql(string sqlWhere)
{
return $" select count(*) from { DB_NAME_SECURITY_SCHEDULE_TASK_QUEUE} where 1=1 {sqlWhere}";
}
public string GetSelectCountFromBySqlServer(string sqlWhere)
{
return $" select count(*) from { DB_NAME_SECURITY_SCHEDULE_TASK_QUEUE} with(nolock) where 1=1 {sqlWhere}";
}
public override string GetSelectTopFrom(int limit, int start, string orderby, string orderbytag, string sqlWhere)
{
if (ProviderName.Contains("MySql"))
{
return GetSelectTopFromByMySql(limit, start, orderby, orderbytag, sqlWhere);
}
else if (ProviderName.Contains("SqlServer"))
{
return GetSelectTopFromBySqlServer(limit, start, orderby, orderbytag, sqlWhere);
}
else
{
throw new NotSupportedException($"不支持的数据库提供程序:{ProviderName}");
}
}
public string GetSelectTopFromByMySql(int limit, int start,string orderby,string orderbytag, string sqlWhere)
{
if (string.IsNullOrEmpty(orderbytag) || orderbytag.Trim() != "desc") orderbytag = "asc";
if (string.IsNullOrEmpty(orderby) || !DB_NAME_FIELDS.Contains(orderby)) orderby = DB_QUEUE_ID ;
int offset = limit * (start - 1);
return $" select {DB_NAME_FIELDS} from (select {DB_NAME_FIELDS} ,row_number() over(order by {orderby} {orderbytag}) as num from { DB_NAME_SECURITY_SCHEDULE_TASK_QUEUE} where 1=1 {sqlWhere} ) a where num> {offset} LIMIT {limit} ";
}
public string GetSelectTopFromBySqlServer(int limit, int start,string orderby,string orderbytag, string sqlWhere)
{
if (string.IsNullOrEmpty(orderbytag) || orderbytag.Trim() != "desc") orderbytag = "asc";
if (string.IsNullOrEmpty(orderby) || !DB_NAME_FIELDS.Contains(orderby)) orderby = DB_QUEUE_ID ;
string top = limit > 0 ? $"top {limit}" : "";
return $" select {top} {DB_NAME_FIELDS} from (select {DB_NAME_FIELDS} ,row_number() over(order by {orderby} {orderbytag}) as num from { DB_NAME_SECURITY_SCHEDULE_TASK_QUEUE} with(nolock) where 1=1 {sqlWhere} ) a where num> {limit * (start - 1)}";
}
public SecurityScheduleTaskQueueEntity Clone()
{
SecurityScheduleTaskQueueEntity result = new SecurityScheduleTaskQueueEntity();
result.CopyFrom(this);
return result;
}
}
}
@@ -23,6 +23,7 @@ namespace CloudBuilder.Security.Policy
public const string LYRIC = "L";
public const string JPG = ".jpg";
public const string M3U8 = ".m3u8";
public static FileTypePolicy instance = null;
@@ -78,7 +79,16 @@ namespace CloudBuilder.Security.Policy
return GetType(value) == LYRIC;
}
public static string PackPicUrl(IApplicationService service, string createdBy, string orderKey)
{
return PackUrl(service, createdBy, orderKey, YesNoPolicy.YES, true);
}
public static string PackUrl(IApplicationService service, string createdBy, string orderKey, string transcodeIndc)
{
return PackUrl(service, createdBy, orderKey, transcodeIndc, false);
}
public static string PackUrl(IApplicationService service, string createdBy, string orderKey, string transcodeIndc, bool isPic)
{
string url = string.Empty;
var webRootPath = service.Configuration[ServiceSettingsPolicy.RequestPath] ?? "";
@@ -114,10 +124,20 @@ namespace CloudBuilder.Security.Policy
{
if (transcodeIndc == YesNoPolicy.YES)
{
var upload = (ServiceSettingsPolicy.GetDmsFileBackupDirectory(service) ?? "").Replace(phy ?? "", "");
var filePathRel = Path.Combine(upload, createdBy, fileExtension.Replace(".", ""), "");
var filePath = filePathRel.Replace(Path.DirectorySeparatorChar, '/') + "/";
url = service.Configuration[AppsettingsPolicy.ApplicationUrl] + webRootPath + filePath + Path.GetFileNameWithoutExtension(orderKey) + JPG + "?v=" + DateTime.Now.ToString("yyyyMMddhhmmss");
if (isPic)
{
var upload = (ServiceSettingsPolicy.GetDmsFileBackupDirectory(service) ?? "").Replace(phy ?? "", "");
var filePathRel = Path.Combine(upload, createdBy, fileExtension.Replace(".", ""), "");
var filePath = filePathRel.Replace(Path.DirectorySeparatorChar, '/') + "/";
url = service.Configuration[AppsettingsPolicy.ApplicationUrl] + webRootPath + filePath + Path.GetFileNameWithoutExtension(orderKey) + JPG + "?v=" + DateTime.Now.ToString("yyyyMMddhhmmss");
}
else
{
var backup = (ServiceSettingsPolicy.GetDmsFileBackupDirectory(service) ?? "").Replace(phy ?? "", "");
var filePathRel = Path.Combine(backup, createdBy, M3U8.Replace(".", ""), "");
var filePath = filePathRel.Replace(Path.DirectorySeparatorChar, '/') + "/";
url = service.Configuration[AppsettingsPolicy.ApplicationUrl] + webRootPath + filePath + Path.GetFileNameWithoutExtension(orderKey) + M3U8;
}
}
else
{
@@ -136,7 +156,7 @@ namespace CloudBuilder.Security.Policy
}
return url;
}
public static string PackSourceVideoUrl(IApplicationService service, string createdBy, string orderKey)
public static string PackSourceVideoUrl(IApplicationService service, string createdBy, string orderKey, string transcodeIndc)
{
var webRootPath = service.Configuration[ServiceSettingsPolicy.RequestPath] ?? "";
var phy = service.Configuration[ServiceSettingsPolicy.PhysicalFileDirectory] ?? "";
@@ -145,8 +165,16 @@ namespace CloudBuilder.Security.Policy
// 使用Path.Combine拼接路径,再将系统分隔符转为URL标准正斜杠
var filePathRel = Path.Combine(upload, createdBy, fileExtension.Replace(".", ""), "");
var filePath = filePathRel.Replace(Path.DirectorySeparatorChar, '/') + "/";
if (YesNoPolicy.IsYes(transcodeIndc))
{
filePathRel = Path.Combine(upload, createdBy, M3U8.Replace(".", ""), "");
}
var filePath = filePathRel.Replace(Path.DirectorySeparatorChar, '/') + "/";
if (YesNoPolicy.IsYes(transcodeIndc))
{
return (service.Configuration[AppsettingsPolicy.ApplicationUrl] ?? "") + webRootPath + filePath + Path.GetFileNameWithoutExtension(orderKey) + M3U8;
}
return (service.Configuration[AppsettingsPolicy.ApplicationUrl] ?? "") + webRootPath + filePath + orderKey;
}
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<NameOfLastUsedPublishProfile>D:\Docker\CloudBuilder\CloudBuilder.Web.Entry\Properties\PublishProfiles\FolderProfile4.pubxml</NameOfLastUsedPublishProfile>
<NameOfLastUsedPublishProfile>D:\Docker\CloudBuilder\CloudBuilder.Web.Entry\Properties\PublishProfiles\FolderProfile3.pubxml</NameOfLastUsedPublishProfile>
<ActiveDebugProfile>http</ActiveDebugProfile>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
@@ -3,7 +3,7 @@
<Project>
<PropertyGroup>
<_PublishTargetUrl>C:\inetpub\wwwroot\dockwebapi2</_PublishTargetUrl>
<History>True|2026-09-19T01:48:52.0085130Z||;False|2026-09-19T09:47:56.1658214+08:00||;True|2026-09-17T18:50:15.9493380+08:00||;True|2026-09-17T18:11:11.5364547+08:00||;True|2026-09-17T18:07:27.7830758+08:00||;True|2026-09-17T17:58:16.5798560+08:00||;True|2026-09-17T15:37:30.9025614+08:00||;True|2026-09-17T15:25:46.9116292+08:00||;True|2026-09-17T15:05:18.6592403+08:00||;True|2026-09-17T14:57:28.7997437+08:00||;True|2026-09-17T14:36:00.6339386+08:00||;True|2026-09-17T13:56:43.2376873+08:00||;True|2026-09-16T13:56:51.8724546+08:00||;True|2026-09-15T20:44:46.6559899+08:00||;True|2026-09-13T19:02:59.5654245+08:00||;True|2026-09-10T09:14:56.2914193+08:00||;True|2026-09-09T16:40:16.6461154+08:00||;True|2026-09-08T13:55:23.1502435+08:00||;True|2026-09-08T08:04:53.4279263+08:00||;True|2026-09-07T08:48:17.4682304+08:00||;True|2026-09-04T14:39:08.7878670+08:00||;True|2026-09-04T14:35:48.2937877+08:00||;True|2026-09-04T11:45:16.1372876+08:00||;True|2026-09-04T11:42:59.9356436+08:00||;True|2026-09-03T16:05:52.5270232+08:00||;True|2026-09-03T14:52:56.8559144+08:00||;True|2026-09-02T11:08:23.8720038+08:00||;True|2026-09-02T10:58:16.8081797+08:00||;True|2026-08-26T13:34:12.3805892+08:00||;True|2026-08-25T08:31:30.7787234+08:00||;True|2026-08-20T13:10:46.4725468+08:00||;True|2026-08-20T13:10:28.3142576+08:00||;True|2026-08-19T16:10:27.3362887+08:00||;True|2026-08-19T16:01:12.6234971+08:00||;True|2026-08-19T15:42:46.6576265+08:00||;True|2026-08-19T13:39:59.9363522+08:00||;True|2026-08-19T13:36:53.0379313+08:00||;True|2026-08-19T13:31:36.0841398+08:00||;True|2026-08-19T11:44:37.5319626+08:00||;True|2026-08-19T09:36:45.6000047+08:00||;True|2026-08-19T09:34:36.8468631+08:00||;True|2026-08-19T08:35:41.2202300+08:00||;True|2026-08-18T16:20:59.0170916+08:00||;</History>
<History>True|2026-09-21T08:51:19.8137872Z||;True|2026-09-21T16:30:01.0950896+08:00||;True|2026-09-21T15:09:00.2326737+08:00||;True|2026-09-21T14:47:09.6120256+08:00||;True|2026-09-21T14:16:35.3194409+08:00||;True|2026-09-21T13:54:58.2829712+08:00||;True|2026-09-21T13:36:45.3134499+08:00||;True|2026-09-19T09:48:52.0085130+08:00||;False|2026-09-19T09:47:56.1658214+08:00||;True|2026-09-17T18:50:15.9493380+08:00||;True|2026-09-17T18:11:11.5364547+08:00||;True|2026-09-17T18:07:27.7830758+08:00||;True|2026-09-17T17:58:16.5798560+08:00||;True|2026-09-17T15:37:30.9025614+08:00||;True|2026-09-17T15:25:46.9116292+08:00||;True|2026-09-17T15:05:18.6592403+08:00||;True|2026-09-17T14:57:28.7997437+08:00||;True|2026-09-17T14:36:00.6339386+08:00||;True|2026-09-17T13:56:43.2376873+08:00||;True|2026-09-16T13:56:51.8724546+08:00||;True|2026-09-15T20:44:46.6559899+08:00||;True|2026-09-13T19:02:59.5654245+08:00||;True|2026-09-10T09:14:56.2914193+08:00||;True|2026-09-09T16:40:16.6461154+08:00||;True|2026-09-08T13:55:23.1502435+08:00||;True|2026-09-08T08:04:53.4279263+08:00||;True|2026-09-07T08:48:17.4682304+08:00||;True|2026-09-04T14:39:08.7878670+08:00||;True|2026-09-04T14:35:48.2937877+08:00||;True|2026-09-04T11:45:16.1372876+08:00||;True|2026-09-04T11:42:59.9356436+08:00||;True|2026-09-03T16:05:52.5270232+08:00||;True|2026-09-03T14:52:56.8559144+08:00||;True|2026-09-02T11:08:23.8720038+08:00||;True|2026-09-02T10:58:16.8081797+08:00||;True|2026-08-26T13:34:12.3805892+08:00||;True|2026-08-25T08:31:30.7787234+08:00||;True|2026-08-20T13:10:46.4725468+08:00||;True|2026-08-20T13:10:28.3142576+08:00||;True|2026-08-19T16:10:27.3362887+08:00||;True|2026-08-19T16:01:12.6234971+08:00||;True|2026-08-19T15:42:46.6576265+08:00||;True|2026-08-19T13:39:59.9363522+08:00||;True|2026-08-19T13:36:53.0379313+08:00||;True|2026-08-19T13:31:36.0841398+08:00||;True|2026-08-19T11:44:37.5319626+08:00||;True|2026-08-19T09:36:45.6000047+08:00||;True|2026-08-19T09:34:36.8468631+08:00||;True|2026-08-19T08:35:41.2202300+08:00||;True|2026-08-18T16:20:59.0170916+08:00||;</History>
<LastFailureDetails />
</PropertyGroup>
</Project>
@@ -10,7 +10,7 @@
"DbContexts": {
"MasterDbContext": {
"DbContextTypeName": "MasterDbContext",
"ConnectionString": "server=nas.youjiala.com;port=3307;database=builder;uid=root;pwd=Root@1237890;CharSet=utf8mb4;",
"ConnectionString": "server=nas.youjiala.com;port=3307;database=Furion;uid=root;pwd=Root@1237890;CharSet=utf8mb4;",
"DatabaseType": "MySql",
"LazyLoadingProxiesEnabled": true,
"AuditEntityEnabled": true,
@@ -58,11 +58,14 @@
"PhysicalFileDirectory": "D:\\Net8\\FileServer",
"UploadFileDirectory": "D:\\Net8\\FileServer\\Upload",
"BackupFileDirectory": "D:\\Net8\\FileServer\\Backup",
"ScaleFileDirectory": "D:\\Net8\\FileServer\\Backup",
"ScaleFileDirectory": "D:\\Net8\\FileServer\\Scale",
"RequestPath": "/FileServer", //如果是IIS反向代理来的,那么要在本地给这个文件添加IUSR,IIS_IUSRS权限
"DmsFileDirectory": "DmsFile",
"ExcelOutputDirectory": "D:\\Net8\\FileServer\\Output"
},
"ScheduleTask": {
"Ffmpeg": "RunTask"
},
"Ffmpeg": {
"Path": "D:\\NET8\\Exe\\ffmpeg\\bin\\ffmpeg.exe", //视频转码
"Pictrue": " -i {0} -ss 00:00:2.000 -frames:v 1 -vf \"scale=1280:-1\" -q:v 4 {1}", //" -i {0} -ss 00:00:2.000 -frames:v 1 {1}",