优化流式文件下载体验, 新增禁止注册选项, 更新sql

This commit is contained in:
root 2024-12-05 21:12:36 +08:00
parent f1e43edde7
commit e6bdd287c9
9 changed files with 57 additions and 23 deletions

View file

@ -91,6 +91,8 @@ namespace iFileProxy.Config
public List<string> RoutesToTrack { get; set; } = [];
public int DailyRequestLimitPerIP { get; set; } = -1;
public bool AllowDifferentIPsForDownload { get; set; } = true;
public bool AllowStreamTransferOrZeroSize { get; set; } = false;
public bool EnableUserRegister { get; set; } = true;
}
public partial class Database

View file

@ -1,15 +1,15 @@
using iFileProxy.Attributes;
using iFileProxy.Config;
using iFileProxy.Helpers;
using iFileProxy.Models;
using iFileProxy.Services;
using Microsoft.AspNetCore.Mvc;
using System.Linq;
namespace iFileProxy.Controllers
{
[Route("[controller]")]
[ApiController]
public class UserController(AuthService authService, ILogger<UserController> logger) : ControllerBase
public class UserController(AuthService authService, ILogger<UserController> logger, AppConfig appConfig) : ControllerBase
{
private readonly AuthService _authService = authService;
private readonly ILogger<UserController> _logger = logger;
@ -20,6 +20,8 @@ namespace iFileProxy.Controllers
[HttpPost("register")]
public async Task<ActionResult<CommonRsp>> Register([FromBody] RegisterRequest request)
{
if (!appConfig.SecurityOptions.EnableUserRegister)
return BadRequest(new CommonRsp { Message = "管理员设置了禁止注册新用户", Retcode = -1 });
try
{
var ip = MasterHelper.GetClientIPAddr(HttpContext);

View file

@ -32,14 +32,14 @@ namespace iFileProxy.Controllers
TaskAddState.ErrUrlInvalid => (ActionResult<CommonRsp>)Ok(new CommonRsp() { Retcode = (int)TaskAddState.ErrUrlInvalid, Message = "非法Url" }),
TaskAddState.ErrDbFail => (ActionResult<CommonRsp>)Ok(new CommonRsp() { Retcode = (int)TaskAddState.ErrDbFail, Message = "数据库数据提交失败!" }),
TaskAddState.ErrMaxParallelTasksLimit => (ActionResult<CommonRsp>)Ok(new CommonRsp() { Retcode = (int)TaskAddState.ErrMaxParallelTasksLimit, Message = "服务端并行数量达到上限!" }),
TaskAddState.ErrFileSizeLimit => (ActionResult<CommonRsp>)Ok(new CommonRsp() { Retcode = (int)TaskAddState.ErrFileSizeLimit, Message = "指定的文件大小超过系统最大限制!" }),
TaskAddState.ErrFileSizeLimit => (ActionResult<CommonRsp>)Ok(new CommonRsp() { Retcode = (int)TaskAddState.ErrFileSizeLimit, Message = "文件大小无效!" }),
TaskAddState.ErrFileNameForbidden => (ActionResult<CommonRsp>)Ok(new CommonRsp() { Retcode = (int)TaskAddState.ErrFileNameForbidden, Message = "文件名非法!" }),
TaskAddState.ErrIPForbidden => (ActionResult<CommonRsp>)Ok(new CommonRsp() { Retcode = (int)TaskAddState.ErrIPForbidden, Message = "请求次数超过限制!" }),
TaskAddState.ErrTargetHostForbidden => (ActionResult<CommonRsp>)Ok(new CommonRsp() { Retcode = (int)TaskAddState.ErrTargetHostForbidden, Message = "目标主机不在服务白名单内!" }),
TaskAddState.ErrGetFileInfo => (ActionResult<CommonRsp>)Ok(new CommonRsp() { Retcode = (int)TaskAddState.ErrGetFileInfo, Message = "目标文件信息获取失败!" }),
TaskAddState.ErrQueueLengthLimit => (ActionResult<CommonRsp>)Ok(new CommonRsp() { Retcode = (int)TaskAddState.ErrQueueLengthLimit, Message = "服务器任务队列已满 请稍候重试!" }),
TaskAddState.Pending => (ActionResult<CommonRsp>)Ok(new CommonRsp() { Retcode = (int)TaskAddState.Pending, Message = "已经添加到任务队列!" }),
TaskAddState.ErrDisabledStreamTransferOrZeroSize => (ActionResult<CommonRsp>)Ok(new CommonRsp() { Retcode = (int)TaskAddState.ErrDisabledStreamTransferOrZeroSize, Message = "禁止0大小文件或者流式传输!" }),
_ => (ActionResult<CommonRsp>)Ok(new CommonRsp() { Retcode = (int)TaskAddState.Success, Message = "succ default" }),
};
}

View file

@ -85,6 +85,16 @@ namespace iFileProxy.Helpers
return false;
}
public static long GetDownloadFileSize(string fileName)
{
if (CheckDownloadFileExists(fileName))
{
return new FileInfo(Path.Combine(AppConfig.GetCurrConfig().DownloadOptions.SavePath, fileName)).Length;
}
else
return -1;
}
/// <summary>
/// 删除指定的已下载文件
/// </summary>

View file

@ -101,6 +101,10 @@
/// 队列大小达到设定最大值
/// </summary>
ErrQueueLengthLimit = 13,
/// <summary>
/// 文件不允许0大小或者流式(动态大小)传输
/// </summary>
ErrDisabledStreamTransferOrZeroSize = 14,
}
public class DownloadFileInfo {
/// <summary>

View file

@ -375,7 +375,7 @@ namespace iFileProxy.Services
}
return true;
}
public bool UpdateFieldsData(string fieldsName, string key,string val)
public bool UpdateFieldsData(string fieldsName, string taskUUID,object val)
{
string sql = $"UPDATE t_tasks_info set `{fieldsName}` = @Data WHERE `tid` = @tid";
MySqlConnection conn = GetAndOpenDBConn("iFileProxy_Db");
@ -383,7 +383,7 @@ namespace iFileProxy.Services
{
using MySqlCommand sqlCmd = new(sql, conn);
sqlCmd.Parameters.AddWithValue("@Data",val);
sqlCmd.Parameters.AddWithValue("@tid",key);
sqlCmd.Parameters.AddWithValue("@tid",taskUUID);
if (sqlCmd.ExecuteNonQuery() == 1)
{
return true;

View file

@ -25,10 +25,22 @@ namespace iFileProxy.Services
// 事件处理程序:任务完成后调度下一任务
private void HandleTaskCompleted(object? sender, TaskInfo taskInfo)
{
_logger.Debug($"[TaskId: {taskInfo.TaskId}] End.");
_logger.Debug($"[TaskId: {taskInfo.TaskId}] Download Successful.");
_logger.Information($"Running Task Num: {_runningTasks.Count}");
_logger.Information($"Queue Task Num: {_pendingTasks.Count}");
// 如果先前获取的大小不正确 则现在更新文件大小
if (taskInfo.Size <= 0)
{
if (MasterHelper.CheckDownloadFileExists(taskInfo.FileName))
{
taskInfo.Size =MasterHelper.GetDownloadFileSize(taskInfo.FileName);
_dbGateService.UpdateFieldsData("size", taskInfo.TaskId, taskInfo.Size);
}
}
// 等待队列中有内容并且当前正在运行的任务小于最大并行任务
if (_pendingTasks.Count > 0 && _runningTasks.Count < _appConfig.DownloadOptions.MaxParallelTasks)
{
@ -106,9 +118,12 @@ namespace iFileProxy.Services
if (fileInfo == null)
return TaskAddState.ErrGetFileInfo;
if (fileInfo.Size == 0 || fileInfo.Size > _appConfig.DownloadOptions.MaxAllowedFileSize)
if (fileInfo.Size > _appConfig.DownloadOptions.MaxAllowedFileSize)
return TaskAddState.ErrFileSizeLimit;
if (fileInfo.Size <= 0 && !_appConfig.SecurityOptions.AllowStreamTransferOrZeroSize)
return TaskAddState.ErrDisabledStreamTransferOrZeroSize;
if (_appConfig.SecurityOptions.BlockedFileName.IndexOf(fileInfo.FileName) != -1)
return TaskAddState.ErrFileNameForbidden;

View file

@ -1,17 +1,17 @@
/*
Navicat Premium Data Transfer
Source Server : _阿里云
Source Server : VPS
Source Server Type : MySQL
Source Server Version : 50743
Source Host : 127.0.0.1:3306
Source Schema : iFileProxy
Source Host : localhost:3306
Source Schema : ifileproxy
Target Server Type : MySQL
Target Server Version : 50743
File Encoding : 65001
Date: 04/12/2024 00:13:59
Date: 05/12/2024 21:11:55
*/
SET NAMES utf8mb4;
@ -31,7 +31,7 @@ CREATE TABLE `t_system_logs` (
PRIMARY KEY (`log_id`) USING BTREE,
INDEX `idx_timestamp`(`timestamp`) USING BTREE,
INDEX `idx_level`(`level`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Table structure for t_tasks_info
@ -40,18 +40,18 @@ DROP TABLE IF EXISTS `t_tasks_info`;
CREATE TABLE `t_tasks_info` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增键',
`tid` varchar(48) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '任务id',
`file_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '文件名',
`file_name` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '文件名',
`client_ip` varchar(46) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '客户端IP',
`add_time` datetime NOT NULL COMMENT '任务在何时被添加',
`update_time` datetime NOT NULL COMMENT '任务状态更新时间',
`status` int(1) NULL DEFAULT NULL COMMENT '任务状态',
`url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '文件url',
`size` bigint(11) NULL DEFAULT NULL COMMENT '文件大小',
`url` varchar(8192) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '文件url',
`size` bigint(32) NULL DEFAULT NULL COMMENT '文件大小',
`hash` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '文件hash',
`tag` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '标记',
`tag` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '标记',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `tid`(`tid`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 111135 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
) ENGINE = InnoDB AUTO_INCREMENT = 111151 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Table structure for t_user_events
@ -67,7 +67,7 @@ CREATE TABLE `t_user_events` (
PRIMARY KEY (`event_id`) USING BTREE,
INDEX `user_id`(`user_id`) USING BTREE,
CONSTRAINT `t_user_events_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `t_users` (`user_id`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Table structure for t_users
@ -87,6 +87,6 @@ CREATE TABLE `t_users` (
PRIMARY KEY (`user_id`) USING BTREE,
UNIQUE INDEX `username`(`username`) USING BTREE,
UNIQUE INDEX `email`(`email`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC;
SET FOREIGN_KEY_CHECKS = 1;

View file

@ -28,7 +28,6 @@
"github.com"
],
"BlockedFileName": [ //
"a.txt"
],
"BlockedClientIP": [ // 使IP
"127.0.0.1"
@ -38,10 +37,12 @@
"/Download",
"/AddOfflineTask"
],
"AllowDifferentIPsForDownload": true // IP
"AllowDifferentIPsForDownload": true, // IP
"AllowStreamTransferOrZeroSize": true, // 0
"EnableUserRegister": true //
},
"GithubProxy": {
"SizeLimit": 1073741824,
"SizeLimit": 10000000000,
"Blacklist": [
"blockedUser1",
"blockedUser2/blockedRepo",