新增文件服务接口

master
xiaochanghai 1 year ago
parent cfe350e3ee
commit e6273e2487
  1. 1
      .gitignore
  2. 2403
      Model/Tiobon.Web.pdm
  3. 85
      Tiobon.Core.Api/Controllers/FileController.cs
  4. 4
      Tiobon.Core.Api/Tiobon.Core.Model.xml
  5. 19
      Tiobon.Core.Api/Tiobon.Core.xml
  6. 198
      Tiobon.Core.Common/Helper/StringHelper.cs
  7. 1
      Tiobon.Core.DataAccess/DataContext.cs
  8. 2
      Tiobon.Core.Model/Base/BasePoco.cs
  9. 3
      Tiobon.Core.Model/Base/Ghre/Ghre_Attachment.Dto.Base.cs
  10. 2
      Tiobon.Core.Model/Edit/Ghre/Ghre_Attachment.Dto.EditInput.cs
  11. 2
      Tiobon.Core.Model/Insert/Ghre/Ghre_Attachment.Dto.InsertInput.cs
  12. 4
      Tiobon.Core.Model/Models/Ghre/Ghre_Attachment.cs
  13. 2
      Tiobon.Core.Model/View/Ghre/Ghre_Attachment.Dto.View.cs

1
.gitignore vendored

@ -28,6 +28,7 @@ bld/
[Ll]og/ [Ll]og/
Log/ Log/
Logs/ Logs/
upload/
# Visual Studio 2015/2017 cache/options directory # Visual Studio 2015/2017 cache/options directory
.vs/ .vs/
# Uncomment if you have tasks that create the project's static files in wwwroot # Uncomment if you have tasks that create the project's static files in wwwroot

File diff suppressed because it is too large Load Diff

@ -0,0 +1,85 @@
using System.Dynamic;
using MySqlX.XDevAPI.Common;
using SqlSugar;
using Tiobon.Core.DataAccess;
namespace Tiobon.Core.Controllers;
/// <summary>
/// 文件服务
/// </summary>
[Produces("application/json")]
[Route("api/File"), ApiExplorerSettings(GroupName = Grouping.GroupName_Ghre)]
public class FileController : BaseApiController
{
public ITiobonArticleServices _TiobonArticleServices { get; set; }
private readonly ILogger<TiobonController> _logger;
/// <summary>
/// 构造函数
/// </summary>
/// <param name="logger"></param>
///
public FileController(ILogger<TiobonController> logger)
{
_logger = logger;
}
#region 上传图片
/// <summary>
/// 上传图片
/// </summary>
/// <param name="fileList"></param>
/// <returns></returns>
[HttpPost, Route("UploadImage")]
public async Task<ServiceResult<string>> UploadImageAsync(IFormFileCollection fileList)
{
string filePath = null;
using var _context = ContextFactory.CreateContext();
if (fileList.Count > 0)
{
filePath = !string.IsNullOrEmpty(filePath) ? filePath : "upload";
foreach (var file in fileList)
{
var ext = string.Empty;
if (string.IsNullOrEmpty(file.FileName) == false)
{
var dotPos = file.FileName.LastIndexOf('.');
ext = file.FileName.Substring(dotPos + 1);
}
string pathHeader = "wwwroot/" + filePath;
if (!Directory.Exists(pathHeader))
Directory.CreateDirectory(pathHeader);
string fileName = StringHelper.GetSysID();
filePath = "/" + filePath + "/" + $"{fileName}.{ext}";
//var filepath = Path.Combine(pathHeader, file.FileName);
using (var stream = global::System.IO.File.Create("wwwroot/" + filePath))
{
await file.CopyToAsync(stream);
}
Ghre_Attachment fileAttachment = new Ghre_Attachment();
fileAttachment.Id = SnowFlakeSingle.Instance.NextId();
fileAttachment.AttachFileName = file.FileName;
fileAttachment.CreateBy = App.User.ID;
fileAttachment.CreateTime = DateTime.Now;
fileAttachment.AttachmentName = fileName;
fileAttachment.AttachFileExtension = ext;
fileAttachment.AttachFileSize = file.Length;
fileAttachment.PhysicsPath = filePath;
fileAttachment.AttachmentType = file.ContentType;
//url = fileName + "." + ext;
_context.Add(fileAttachment);
_context.SaveChanges();
}
}
return Success<string>(filePath);
}
#endregion
}

@ -197,12 +197,10 @@
附件扩展名 附件扩展名
</summary> </summary>
</member> </member>
<member name="P:Tiobon.Core.Model.Models.Ghre_AttachmentBase.AttachFileSize"> <member name="P:Tiobon.Core.Model.Models.Ghre_AttachmentBase.PhysicsPath">
<summary> <summary>
附件大小 附件大小
</summary> </summary>
</member>
<member name="P:Tiobon.Core.Model.Models.Ghre_AttachmentBase.PhysicsPath">
<summary> <summary>
物理路径 物理路径
</summary> </summary>

@ -273,6 +273,25 @@
</summary> </summary>
<returns></returns> <returns></returns>
</member> </member>
<member name="T:Tiobon.Core.Controllers.FileController">
<summary>
文件服务
</summary>
</member>
<member name="M:Tiobon.Core.Controllers.FileController.#ctor(Microsoft.Extensions.Logging.ILogger{Tiobon.Core.Controllers.TiobonController})">
<summary>
构造函数
</summary>
<param name="logger"></param>
</member>
<member name="M:Tiobon.Core.Controllers.FileController.UploadImageAsync(Microsoft.AspNetCore.Http.IFormFileCollection)">
<summary>
上传图片
</summary>
<param name="fileList"></param>
<returns></returns>
</member>
<member name="T:Tiobon.Core.Controllers.LoginController"> <member name="T:Tiobon.Core.Controllers.LoginController">
<summary> <summary>
登录管理【无权限】 登录管理【无权限】

@ -1,111 +1,119 @@
using System; using System.Text;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
namespace Tiobon.Core.Common.Helper namespace Tiobon.Core.Common.Helper;
public class StringHelper
{ {
public class StringHelper /// <summary>
/// 根据分隔符返回前n条数据
/// </summary>
/// <param name="content">数据内容</param>
/// <param name="separator">分隔符</param>
/// <param name="top">前n条</param>
/// <param name="isDesc">是否倒序(默认false)</param>
/// <returns></returns>
public static List<string> GetTopDataBySeparator(string content, string separator, int top, bool isDesc = false)
{ {
/// <summary> if (string.IsNullOrEmpty(content))
/// 根据分隔符返回前n条数据
/// </summary>
/// <param name="content">数据内容</param>
/// <param name="separator">分隔符</param>
/// <param name="top">前n条</param>
/// <param name="isDesc">是否倒序(默认false)</param>
/// <returns></returns>
public static List<string> GetTopDataBySeparator(string content, string separator, int top, bool isDesc = false)
{ {
if (string.IsNullOrEmpty(content)) return new List<string>() { };
{
return new List<string>() { };
}
if (string.IsNullOrEmpty(separator))
{
throw new ArgumentException("message", nameof(separator));
}
var dataArray = content.Split(separator).Where(d => !string.IsNullOrEmpty(d)).ToArray();
if (isDesc)
{
Array.Reverse(dataArray);
}
if (top > 0)
{
dataArray = dataArray.Take(top).ToArray();
}
return dataArray.ToList();
} }
/// <summary>
/// 根据字段拼接get参数
/// </summary>
/// <param name="dic"></param>
/// <returns></returns>
public static string GetPars(Dictionary<string, object> dic)
{
StringBuilder sb = new StringBuilder(); if (string.IsNullOrEmpty(separator))
string urlPars = null;
bool isEnter = false;
foreach (var item in dic)
{
sb.Append($"{(isEnter ? "&" : "")}{item.Key}={item.Value}");
isEnter = true;
}
urlPars = sb.ToString();
return urlPars;
}
/// <summary>
/// 根据字段拼接get参数
/// </summary>
/// <param name="dic"></param>
/// <returns></returns>
public static string GetPars(Dictionary<string, string> dic)
{ {
throw new ArgumentException("message", nameof(separator));
}
StringBuilder sb = new StringBuilder(); var dataArray = content.Split(separator).Where(d => !string.IsNullOrEmpty(d)).ToArray();
string urlPars = null; if (isDesc)
bool isEnter = false; {
foreach (var item in dic) Array.Reverse(dataArray);
{
sb.Append($"{(isEnter ? "&" : "")}{item.Key}={item.Value}");
isEnter = true;
}
urlPars = sb.ToString();
return urlPars;
} }
/// <summary>
/// 获取一个GUID if (top > 0)
/// </summary> {
/// <param name="format">格式-默认为N</param> dataArray = dataArray.Take(top).ToArray();
/// <returns></returns>
public static string GetGUID(string format="N") {
return Guid.NewGuid().ToString(format);
} }
/// <summary>
/// 根据GUID获取19位的唯一数字序列 return dataArray.ToList();
/// </summary> }
/// <returns></returns> /// <summary>
public static long GetGuidToLongID() /// 根据字段拼接get参数
/// </summary>
/// <param name="dic"></param>
/// <returns></returns>
public static string GetPars(Dictionary<string, object> dic)
{
StringBuilder sb = new StringBuilder();
string urlPars = null;
bool isEnter = false;
foreach (var item in dic)
{ {
byte[] buffer = Guid.NewGuid().ToByteArray(); sb.Append($"{(isEnter ? "&" : "")}{item.Key}={item.Value}");
return BitConverter.ToInt64(buffer, 0); isEnter = true;
} }
/// <summary> urlPars = sb.ToString();
/// 获取字符串最后X行 return urlPars;
/// </summary> }
/// <param name="resourceStr"></param> /// <summary>
/// <param name="length"></param> /// 根据字段拼接get参数
/// <returns></returns> /// </summary>
public static string GetCusLine(string resourceStr, int length) { /// <param name="dic"></param>
string[] arrStr = resourceStr.Split("\r\n"); /// <returns></returns>
return string.Join("", (from q in arrStr select q).Skip(arrStr.Length - length + 1).Take(length).ToArray()); public static string GetPars(Dictionary<string, string> dic)
{
StringBuilder sb = new StringBuilder();
string urlPars = null;
bool isEnter = false;
foreach (var item in dic)
{
sb.Append($"{(isEnter ? "&" : "")}{item.Key}={item.Value}");
isEnter = true;
} }
urlPars = sb.ToString();
return urlPars;
}
/// <summary>
/// 获取一个GUID
/// </summary>
/// <param name="format">格式-默认为N</param>
/// <returns></returns>
public static string GetGUID(string format="N") {
return Guid.NewGuid().ToString(format);
}
/// <summary>
/// 根据GUID获取19位的唯一数字序列
/// </summary>
/// <returns></returns>
public static long GetGuidToLongID()
{
byte[] buffer = Guid.NewGuid().ToByteArray();
return BitConverter.ToInt64(buffer, 0);
}
/// <summary>
/// 获取字符串最后X行
/// </summary>
/// <param name="resourceStr"></param>
/// <param name="length"></param>
/// <returns></returns>
public static string GetCusLine(string resourceStr, int length) {
string[] arrStr = resourceStr.Split("\r\n");
return string.Join("", (from q in arrStr select q).Skip(arrStr.Length - length + 1).Take(length).ToArray());
}
#region 求系统唯一字符串
/// <summary>
/// 求系统唯一字符串,常用于ROW_ID值。
/// </summary>
/// <returns>字符串</returns>
public static string GetSysID()
{
string sid = string.Empty;
byte[] buffer = Guid.NewGuid().ToByteArray();
sid = DateTime.Now.ToString("yyMMddHHmmss") + BitConverter.ToInt64(buffer, 0).ToString();
return sid;
} }
#endregion
} }

@ -8,6 +8,7 @@ namespace Tiobon.Core.DataAccess
public virtual DbSet<Ghra_Grade> Ghra_Grade { get; set; } public virtual DbSet<Ghra_Grade> Ghra_Grade { get; set; }
public virtual DbSet<Ghre_Attachment> Ghre_Attachment { get; set; }
//占位符 //占位符

@ -34,7 +34,7 @@ namespace Tiobon.Core.Model
/// 创建人 /// 创建人
/// </summary> /// </summary>
[Display(Name = "创建人"), SugarColumn(IsOnlyIgnoreUpdate = true)] [Display(Name = "创建人"), SugarColumn(IsOnlyIgnoreUpdate = true)]
public int? CreateBy { get; set; } public long? CreateBy { get; set; }
/// <summary> /// <summary>
/// 创建时间 /// 创建时间

@ -6,7 +6,7 @@
* *
* Ver * Ver
* *
*V0.01 2024/4/23 16:02:54 SimonHsiao *V0.01 2024/4/23 16:17:18 SimonHsiao
* *
* Copyright(c) 2024 Tiobon Corporation. All Rights Reserved. * Copyright(c) 2024 Tiobon Corporation. All Rights Reserved.
* *
@ -90,7 +90,6 @@ namespace Tiobon.Core.Model.Models
/// <summary> /// <summary>
/// 附件大小 /// 附件大小
/// </summary> /// </summary>
public int? AttachFileSize { get; set; }
/// <summary> /// <summary>
/// 物理路径 /// 物理路径

@ -6,7 +6,7 @@
* *
* Ver * Ver
* *
*V0.01 2024/4/23 16:02:54 SimonHsiao *V0.01 2024/4/23 16:17:18 SimonHsiao
* *
* Copyright(c) 2024 Tiobon Corporation. All Rights Reserved. * Copyright(c) 2024 Tiobon Corporation. All Rights Reserved.
* *

@ -6,7 +6,7 @@
* *
* Ver * Ver
* *
*V0.01 2024/4/23 16:02:54 SimonHsiao *V0.01 2024/4/23 16:17:18 SimonHsiao
* *
* Copyright(c) 2024 Tiobon Corporation. All Rights Reserved. * Copyright(c) 2024 Tiobon Corporation. All Rights Reserved.
* *

@ -6,7 +6,7 @@
* *
* Ver * Ver
* *
*V0.01 2024/4/23 16:02:54 SimonHsiao *V0.01 2024/4/23 16:17:18 SimonHsiao
* *
* Copyright(c) 2024 Tiobon Corporation. All Rights Reserved. * Copyright(c) 2024 Tiobon Corporation. All Rights Reserved.
* *
@ -92,7 +92,7 @@ namespace Tiobon.Core.Model.Models
/// <summary> /// <summary>
/// 附件大小 /// 附件大小
/// </summary> /// </summary>
public int? AttachFileSize { get; set; } public long? AttachFileSize { get; set; }
/// <summary> /// <summary>
/// 物理路径 /// 物理路径

@ -6,7 +6,7 @@
* *
* Ver * Ver
* *
*V0.01 2024/4/23 16:02:54 SimonHsiao *V0.01 2024/4/23 16:17:18 SimonHsiao
* *
* Copyright(c) 2024 Tiobon Corporation. All Rights Reserved. * Copyright(c) 2024 Tiobon Corporation. All Rights Reserved.
* *

Loading…
Cancel
Save