😎去掉文件上传指定路径参数及验证文件名合法性

This commit is contained in:
zuohuaijun 2025-06-09 12:06:46 +08:00
parent 1c858b530b
commit 7e1fee09c3
9 changed files with 28 additions and 83 deletions

View File

@ -553,6 +553,12 @@ public enum ErrorCodeEnum
[ErrorCodeItemMetadata("文件已存在")]
D8004,
/// <summary>
/// 无效的文件名
/// </summary>
[ErrorCodeItemMetadata("无效的文件名")]
D8005,
/// <summary>
/// 已存在同名或同编码配置参数
/// </summary>

View File

@ -16,14 +16,10 @@ public class PageFileInput : BasePageInput
/// </summary>
public string FileName { get; set; }
/// <summary>
/// 文件路径
/// </summary>
public string FilePath { get; set; }
/// <summary>
/// 文件后缀
/// </summary>
/// <example></example>
public string? Suffix { get; set; }
/// <summary>
@ -59,11 +55,13 @@ public class UploadFileInput
/// <summary>
/// 文件类别
/// </summary>
/// <example></example>
public string FileType { get; set; }
/// <summary>
/// 文件别名
/// </summary>
/// <example></example>
public string FileAlias { get; set; }
/// <summary>
@ -71,19 +69,10 @@ public class UploadFileInput
/// </summary>
public bool IsPublic { get; set; } = false;
/// <summary>
/// 文件路径
/// </summary>
public string Path { get; set; }
/// <summary>
/// 文件保存路径
/// </summary>
public string SavePath { get; set; }
/// <summary>
/// 允许格式:.jpeg.jpg.png.bmp.gif.tif
/// </summary>
/// <example></example>
public string AllowSuffix { get; set; }
}
@ -105,25 +94,23 @@ public class UploadFileFromBase64Input
/// <summary>
/// 文件类型( "image/jpeg",)
/// </summary>
/// <example></example>
public string ContentType { get; set; }
/// <summary>
/// 文件类别
/// </summary>
/// <example></example>
public string FileType { get; set; }
/// <summary>
/// 文件别名
/// </summary>
/// <example></example>
public string FileAlias { get; set; }
/// <summary>
/// 是否公开
/// </summary>
public bool IsPublic { get; set; } = false;
/// <summary>
/// 保存路径
/// </summary>
public string Path { get; set; }
}

View File

@ -62,7 +62,6 @@ public class SysFileService : IDynamicApiController, ITransient
// 合并公开和私有并分页
return await _sysFileRep.Context.UnionAll(publicList, privateList)
.WhereIF(!string.IsNullOrWhiteSpace(input.FileName), u => u.FileName.Contains(input.FileName.Trim()))
.WhereIF(!string.IsNullOrWhiteSpace(input.FilePath), u => u.FilePath.Contains(input.FilePath.Trim()))
.WhereIF(!string.IsNullOrWhiteSpace(input.StartTime.ToString()) && !string.IsNullOrWhiteSpace(input.EndTime.ToString()),
u => u.CreateTime >= input.StartTime && u.CreateTime <= input.EndTime)
.OrderBy(u => u.CreateTime, OrderByType.Desc)
@ -239,7 +238,9 @@ public class SysFileService : IDynamicApiController, ITransient
[DisplayName("上传文件")]
public async Task<SysFile> UploadFile([FromForm] UploadFileInput input)
{
if (input.File == null) throw Oops.Oh(ErrorCodeEnum.D8000);
if (input.File == null || input.File.Length <= 0) throw Oops.Oh(ErrorCodeEnum.D8000);
if (input.File.FileName.IndexOfAny(Path.GetInvalidFileNameChars()) >= 0) throw Oops.Oh(ErrorCodeEnum.D8005);
// 判断是否重复上传的文件
var sizeKb = input.File.Length / 1024; // 大小KB
@ -281,8 +282,7 @@ public class SysFileService : IDynamicApiController, ITransient
//if (!VerifyFileExtensionName.IsSameType(file.OpenReadStream(), suffix)) throw Oops.Oh(ErrorCodeEnum.D8001);
// 文件存储位置
var path = string.IsNullOrWhiteSpace(input.SavePath) ? _uploadOptions.Path : input.SavePath;
path = path.ParseToDateTimeForRep();
var path = _uploadOptions.Path.ParseToDateTimeForRep();
var newFile = input.Adapt<SysFile>();
newFile.Id = YitIdHelper.NextId();
@ -309,7 +309,7 @@ public class SysFileService : IDynamicApiController, ITransient
[DisplayName("上传头像")]
public async Task<SysFile> UploadAvatar([Required] IFormFile file)
{
var sysFile = await UploadFile(new UploadFileInput { File = file, AllowSuffix = _imageType, SavePath = "upload/avatar" });
var sysFile = await UploadFile(new UploadFileInput { File = file, AllowSuffix = _imageType });
var sysUserRep = _sysFileRep.ChangeRepository<SqlSugarRepository<SysUser>>();
var user = await sysUserRep.GetByIdAsync(_userManager.UserId);
@ -331,7 +331,7 @@ public class SysFileService : IDynamicApiController, ITransient
[DisplayName("上传电子签名")]
public async Task<SysFile> UploadSignature([Required] IFormFile file)
{
var sysFile = await UploadFile(new UploadFileInput { File = file, AllowSuffix = _imageType, SavePath = "upload/signature" });
var sysFile = await UploadFile(new UploadFileInput { File = file, AllowSuffix = _imageType });
var sysUserRep = _sysFileRep.ChangeRepository<SqlSugarRepository<SysUser>>();
var user = await sysUserRep.GetByIdAsync(_userManager.UserId);

View File

@ -721,7 +721,7 @@ public class SysTenantService : IDynamicApiController, ITransient
Directory.CreateDirectory(absoluteDirPath);
// 保存轮播图文件
var sysFile = await _sysFileService.UploadFile(new UploadFileInput { File = file, FileType = "Carousel", SavePath = path });
var sysFile = await _sysFileService.UploadFile(new UploadFileInput { File = file, FileType = "Carousel" });
//// 保存轮播图配置
//sysFile.BelongId = tenant.Id;

View File

@ -149,7 +149,7 @@ public class SysWxOpenService : IDynamicApiController, ITransient
if (wxUser == null)
throw Oops.Oh("未找到用户上传失败");
var res = await _sysFileService.UploadFile(new UploadFileInput { File = input.File, FileType = input.FileType, Path = input.Path });
var res = await _sysFileService.UploadFile(new UploadFileInput { File = input.File, FileType = input.FileType });
wxUser.Avatar = res.Url;
await _sysOAuthUserRep.AsUpdateable(wxUser).IgnoreColumns(true).ExecuteCommandAsync();

View File

@ -573,13 +573,11 @@ export const SysFileApiAxiosParamCreator = function (configuration?: Configurati
* @param {string} [fileType]
* @param {string} [fileAlias]
* @param {boolean} [isPublic]
* @param {string} [path]
* @param {string} [savePath]
* @param {string} [allowSuffix]
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
apiSysFileUploadFilePostForm: async (file?: Blob, fileType?: string, fileAlias?: string, isPublic?: boolean, path?: string, savePath?: string, allowSuffix?: string, options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
apiSysFileUploadFilePostForm: async (file?: Blob, fileType?: string, fileAlias?: string, isPublic?: boolean, allowSuffix?: string, options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
const localVarPath = `/api/sysFile/uploadFile`;
// use dummy base URL string because the URL constructor only accepts absolute URLs.
const localVarUrlObj = new URL(localVarPath, 'https://example.com');
@ -618,14 +616,6 @@ export const SysFileApiAxiosParamCreator = function (configuration?: Configurati
localVarFormParams.append('IsPublic', isPublic as any);
}
if (path !== undefined) {
localVarFormParams.append('Path', path as any);
}
if (savePath !== undefined) {
localVarFormParams.append('SavePath', savePath as any);
}
if (allowSuffix !== undefined) {
localVarFormParams.append('AllowSuffix', allowSuffix as any);
}
@ -923,14 +913,12 @@ export const SysFileApiFp = function(configuration?: Configuration) {
* @param {string} [fileType]
* @param {string} [fileAlias]
* @param {boolean} [isPublic]
* @param {string} [path]
* @param {string} [savePath]
* @param {string} [allowSuffix]
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
async apiSysFileUploadFilePostForm(file?: Blob, fileType?: string, fileAlias?: string, isPublic?: boolean, path?: string, savePath?: string, allowSuffix?: string, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<AdminNETResultSysFile>>> {
const localVarAxiosArgs = await SysFileApiAxiosParamCreator(configuration).apiSysFileUploadFilePostForm(file, fileType, fileAlias, isPublic, path, savePath, allowSuffix, options);
async apiSysFileUploadFilePostForm(file?: Blob, fileType?: string, fileAlias?: string, isPublic?: boolean, allowSuffix?: string, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<AdminNETResultSysFile>>> {
const localVarAxiosArgs = await SysFileApiAxiosParamCreator(configuration).apiSysFileUploadFilePostForm(file, fileType, fileAlias, isPublic, allowSuffix, options);
return (axios: AxiosInstance = globalAxios, basePath: string = BASE_PATH) => {
const axiosRequestArgs :AxiosRequestConfig = {...localVarAxiosArgs.options, url: basePath + localVarAxiosArgs.url};
return axios.request(axiosRequestArgs);
@ -1090,14 +1078,12 @@ export const SysFileApiFactory = function (configuration?: Configuration, basePa
* @param {string} [fileType]
* @param {string} [fileAlias]
* @param {boolean} [isPublic]
* @param {string} [path]
* @param {string} [savePath]
* @param {string} [allowSuffix]
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
async apiSysFileUploadFilePostForm(file?: Blob, fileType?: string, fileAlias?: string, isPublic?: boolean, path?: string, savePath?: string, allowSuffix?: string, options?: AxiosRequestConfig): Promise<AxiosResponse<AdminNETResultSysFile>> {
return SysFileApiFp(configuration).apiSysFileUploadFilePostForm(file, fileType, fileAlias, isPublic, path, savePath, allowSuffix, options).then((request) => request(axios, basePath));
async apiSysFileUploadFilePostForm(file?: Blob, fileType?: string, fileAlias?: string, isPublic?: boolean, allowSuffix?: string, options?: AxiosRequestConfig): Promise<AxiosResponse<AdminNETResultSysFile>> {
return SysFileApiFp(configuration).apiSysFileUploadFilePostForm(file, fileType, fileAlias, isPublic, allowSuffix, options).then((request) => request(axios, basePath));
},
/**
*
@ -1257,15 +1243,13 @@ export class SysFileApi extends BaseAPI {
* @param {string} [fileType]
* @param {string} [fileAlias]
* @param {boolean} [isPublic]
* @param {string} [path]
* @param {string} [savePath]
* @param {string} [allowSuffix]
* @param {*} [options] Override http request option.
* @throws {RequiredError}
* @memberof SysFileApi
*/
public async apiSysFileUploadFilePostForm(file?: Blob, fileType?: string, fileAlias?: string, isPublic?: boolean, path?: string, savePath?: string, allowSuffix?: string, options?: AxiosRequestConfig) : Promise<AxiosResponse<AdminNETResultSysFile>> {
return SysFileApiFp(this.configuration).apiSysFileUploadFilePostForm(file, fileType, fileAlias, isPublic, path, savePath, allowSuffix, options).then((request) => request(this.axios, this.basePath));
public async apiSysFileUploadFilePostForm(file?: Blob, fileType?: string, fileAlias?: string, isPublic?: boolean, allowSuffix?: string, options?: AxiosRequestConfig) : Promise<AxiosResponse<AdminNETResultSysFile>> {
return SysFileApiFp(this.configuration).apiSysFileUploadFilePostForm(file, fileType, fileAlias, isPublic, allowSuffix, options).then((request) => request(this.axios, this.basePath));
}
/**
*

View File

@ -90,14 +90,6 @@ export interface PageFileInput {
*/
fileName?: string | null;
/**
*
*
* @type {string}
* @memberof PageFileInput
*/
filePath?: string | null;
/**
*
*

View File

@ -52,22 +52,6 @@ export interface SysFileUploadFileBody {
*/
isPublic?: boolean;
/**
*
*
* @type {string}
* @memberof SysFileUploadFileBody
*/
path?: string;
/**
*
*
* @type {string}
* @memberof SysFileUploadFileBody
*/
savePath?: string;
/**
* .jpeg.jpg.png.bmp.gif.tif
*

View File

@ -67,12 +67,4 @@ export interface UploadFileFromBase64Input {
* @memberof UploadFileFromBase64Input
*/
isPublic?: boolean;
/**
*
*
* @type {string}
* @memberof UploadFileFromBase64Input
*/
path?: string | null;
}