web api 文件上传下载帮助类

ops/2024/9/24 4:50:54/
web api调用
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using YiSha.Util;
using YiSha.Util.Extension;
using YiSha.Util.Model;namespace YiSha.Admin.WebApi.Controllers
{[Route("[controller]/[action]")][ApiController][AuthorizeFilter]public class FileController : ControllerBase{#region 上传单个文件[HttpPost]public async Task<TData<string>> UploadFile(int fileModule, IFormCollection fileList){TData<string> obj = await FileHelper.UploadFile(fileModule, fileList.Files);return obj;}#endregion#region 删除单个文件[HttpPost]public TData<string> DeleteFile(int fileModule, string filePath){TData<string> obj = FileHelper.DeleteFile(fileModule, filePath);return obj;}#endregion#region 下载文件[HttpGet]public FileContentResult DownloadFile(string filePath, int delete = 1){TData<FileContentResult> obj = FileHelper.DownloadFile(filePath, delete);if (obj.Tag == 1){return obj.Data;}else{throw new Exception("下载失败:" + obj.Message);}}#endregion}
}

  实现help:

  public class FileHelper{#region 创建文本文件/// <summary>/// 创建文件/// </summary>/// <param name="path"></param>/// <param name="content"></param>public static void CreateFile(string path, string content){if (!Directory.Exists(Path.GetDirectoryName(path))){Directory.CreateDirectory(Path.GetDirectoryName(path));}using (StreamWriter sw = new StreamWriter(path, false, Encoding.UTF8)){sw.Write(content);}}#endregion#region 上传单个文件/// <summary>/// 上传单个文件/// </summary>/// <param name="fileModule"></param>/// <param name="fileCollection"></param>/// <returns></returns>public async static Task<TData<string>> UploadFile(int fileModule, IFormFileCollection files){string dirModule = string.Empty;TData<string> obj = new TData<string>();if (files == null || files.Count == 0){obj.Message = "请先选择文件!";return obj;}if (files.Count > 1){obj.Message = "一次只能上传一个文件!";return obj;}TData objCheck = null;IFormFile file = files[0];switch (fileModule){case (int)UploadFileType.Portrait:objCheck = CheckFileExtension(Path.GetExtension(file.FileName), ".jpg|.jpeg|.gif|.png");if (objCheck.Tag != 1){obj.Message = objCheck.Message;return obj;}dirModule = UploadFileType.Portrait.ToString();break;case (int)UploadFileType.News:if (file.Length > 5 * 1024 * 1024) // 5MB{obj.Message = "文件最大限制为 5MB";return obj;}objCheck = CheckFileExtension(Path.GetExtension(file.FileName), ".jpg|.jpeg|.gif|.png");if (objCheck.Tag != 1){obj.Message = objCheck.Message;return obj;}dirModule = UploadFileType.News.ToString();break;case (int)UploadFileType.Import:objCheck = CheckFileExtension(Path.GetExtension(file.FileName), ".xls|.xlsx");if (objCheck.Tag != 1){obj.Message = objCheck.Message;return obj;}dirModule = UploadFileType.Import.ToString();break;default:obj.Message = "请指定上传到的模块";return obj;}string fileExtension = TextHelper.GetCustomValue(Path.GetExtension(file.FileName), ".png");string newFileName = SecurityHelper.GetGuid(true) + fileExtension;string dir = "Resource" + Path.DirectorySeparatorChar + dirModule + Path.DirectorySeparatorChar + DateTime.Now.ToString("yyyy-MM-dd").Replace('-', Path.DirectorySeparatorChar) + Path.DirectorySeparatorChar;string absoluteDir = Path.Combine(GlobalContext.HostingEnvironment.ContentRootPath, dir);string absoluteFileName = string.Empty;if (!Directory.Exists(absoluteDir)){Directory.CreateDirectory(absoluteDir);}absoluteFileName = absoluteDir + newFileName;try{using (FileStream fs = File.Create(absoluteFileName)){await file.CopyToAsync(fs);fs.Flush();}obj.Data = Path.AltDirectorySeparatorChar + ConvertDirectoryToHttp(dir) + newFileName;obj.Message = Path.GetFileNameWithoutExtension(TextHelper.GetCustomValue(file.FileName, newFileName));obj.Description = (file.Length / 1024).ToString(); // KBobj.Tag = 1;}catch (Exception ex){obj.Message = ex.Message;}return obj;}#endregion#region 删除单个文件/// <summary>/// 删除单个文件/// </summary>/// <param name="fileModule"></param>/// <param name="filePath"></param>/// <returns></returns>public static TData<string> DeleteFile(int fileModule, string filePath){TData<string> obj = new TData<string>();string dirModule = fileModule.GetDescriptionByEnum<UploadFileType>();if (string.IsNullOrEmpty(filePath)){obj.Message = "请先选择文件!";return obj;}filePath = FilterFilePath(filePath);filePath = "Resource" + Path.DirectorySeparatorChar + dirModule + Path.DirectorySeparatorChar + filePath;string absoluteDir = Path.Combine(GlobalContext.HostingEnvironment.ContentRootPath, filePath);try{if (File.Exists(absoluteDir)){File.Delete(absoluteDir);}else{obj.Message = "文件不存在";}obj.Tag = 1;}catch (Exception ex){obj.Message = ex.Message;}return obj;}#endregion#region 下载文件/// <summary>/// 下载文件/// </summary>/// <param name="filePath"></param>/// <param name="delete"></param>/// <returns></returns>public static TData<FileContentResult> DownloadFile(string filePath, int delete){filePath = FilterFilePath(filePath);if (!filePath.StartsWith("wwwroot") && !filePath.StartsWith("Resource")){throw new Exception("非法访问");}TData<FileContentResult> obj = new TData<FileContentResult>();string absoluteFilePath = GlobalContext.HostingEnvironment.ContentRootPath + Path.DirectorySeparatorChar + filePath.Replace(Path.AltDirectorySeparatorChar, Path.DirectorySeparatorChar);byte[] fileBytes = File.ReadAllBytes(absoluteFilePath);if (delete == 1){File.Delete(absoluteFilePath);}// md5 值string fileNamePrefix = DateTime.Now.ToString("yyyyMMddHHmmss");string fileNameWithoutExtension = Path.GetFileNameWithoutExtension(filePath);string title = fileNameWithoutExtension;if (fileNameWithoutExtension.Contains("_")){title = fileNameWithoutExtension.Split('_')[1].Trim();}string fileExtensionName = Path.GetExtension(filePath);obj.Data = new FileContentResult(fileBytes, "application/octet-stream"){FileDownloadName = string.Format("{0}_{1}{2}", fileNamePrefix, title, fileExtensionName)};obj.Tag = 1;return obj;}#endregion #region GetContentTypepublic static string GetContentType(string path){var types = GetMimeTypes();var ext = Path.GetExtension(path).ToLowerInvariant();var contentType = types[ext];if (string.IsNullOrEmpty(contentType)){contentType = "application/octet-stream";}return contentType;}#endregion#region GetMimeTypespublic static Dictionary<string, string> GetMimeTypes(){return new Dictionary<string, string>{{".txt", "text/plain"},{".pdf", "application/pdf"},{".doc", "application/vnd.ms-word"},{".docx", "application/vnd.ms-word"},{".xls", "application/vnd.ms-excel"},{".xlsx", "application/vnd.openxmlformats officedocument.spreadsheetml.sheet"},{".png", "image/png"},{".jpg", "image/jpeg"},{".jpeg", "image/jpeg"},{".gif", "image/gif"},{".csv", "text/csv"}};}#endregionpublic static void CreateDirectory(string directory){if (!Directory.Exists(directory)){Directory.CreateDirectory(directory);}}public static void DeleteDirectory(string filePath){try{if (Directory.Exists(filePath)) //如果存在这个文件夹删除之 {foreach (string d in Directory.GetFileSystemEntries(filePath)){if (File.Exists(d))File.Delete(d); //直接删除其中的文件                        elseDeleteDirectory(d); //递归删除子文件夹 }Directory.Delete(filePath, true); //删除已空文件夹                 }}catch (Exception ex){LogHelper.Error(ex);}}public static string ConvertDirectoryToHttp(string directory){directory = directory.ParseToString();directory = directory.Replace(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar);return directory;}public static string ConvertHttpToDirectory(string http){http = http.ParseToString();http = http.Replace(Path.AltDirectorySeparatorChar, Path.DirectorySeparatorChar);return http;}public static TData CheckFileExtension(string fileExtension, string allowExtension){TData obj = new TData();string[] allowArr = TextHelper.SplitToArray<string>(allowExtension.ToLower(), '|');if (allowArr.Where(p => p.Trim() == fileExtension.ParseToString().ToLower()).Any()){obj.Tag = 1;}else{obj.Message = "只有文件扩展名是 " + allowExtension + " 的文件才能上传";}return obj;}public static string FilterFilePath(string filePath){filePath = filePath.Replace("../", string.Empty);filePath = filePath.Replace("..", string.Empty);filePath = filePath.TrimStart('/');return filePath;}}


http://www.ppmy.cn/ops/104101.html

相关文章

打卡57天------图论(两种算法)

最近的算法题都太高深莫测了&#xff0c;对于一个前端工程师来说&#xff0c;要求没有那么严吧。 今天在学习prim 和 kruskal的同时&#xff0c;也要清楚这两个算法的区别所在。 一、prim算法精讲 代码随想录 无JS官方题解代码。 二、kruskal算法精讲 代码随想录 无JS官方题解…

基于STM32开发的智能家居温度控制系统

目录 引言环境准备工作 硬件准备软件安装与配置系统设计 系统架构硬件连接代码实现 系统初始化温度监测与显示风扇/加热器控制Wi-Fi通信与远程监控应用场景 家庭环境的智能温度管理办公楼的节能温控系统常见问题及解决方案 常见问题解决方案结论 1. 引言 随着人们对生活质量…

zookeeper命令 及 ACL控制

1命令 登录 zkCli.sh -server 192.168.58.81:2128 登录ip zkCli.sh 登录本机 关闭会话 close 帮助文档 help 让zk数据发生变化都是一次事务 create创建 create /aaa 创建持久节点 create -e /aaa/bbb 创建临时节点 create /aaa/bbb/ccc 不能创建成功 …

11-Python 内置类型汇总

Python 提供的数据类型概念是为了更加高效地存放不同业务类型的数据,比如一个清单其实是一个列表,人的户口信息就是一个有多个属性和值的字典,时间由时间类型进行存放。当然,如果你觉得它内置的不能满足你的需求,可以自己定义你的数据类型。 在这里我们先需要了解它的基础…

using showdown js with openAi streaming response

题意&#xff1a;"使用 Showdown.js 处理 OpenAI 流式响应" 问题背景&#xff1a; I tried using showdownjs to translate streamed markdown from OpenAi to HTML "我尝试使用 Showdown.js 将来自 OpenAI 的流式 Markdown 转换为 HTML" I changed the …

UE 【材质编辑】自定义材质节点

使用UE的材质编辑器&#xff0c;蓝图提供了大量的节点函数&#xff1a; 实际上&#xff0c;这是一段封装好的包含一串HLSL代码的容器。打开“Source/Runtime/Engine/Classes/Material”&#xff0c;可以看到很多不同节点的头文件&#xff1a; 照葫芦画瓢 以UMaterialExpressi…

基于单片机的电子抢答器设计(论文+源码+实物)

1系统总体设计 本设计为基于单片机的电子抢答器设计&#xff0c; 整个系统由发射端和接收端两部分组成&#xff0c;在发射部分以STC89C52单片机作为控制器&#xff0c;并配合8个按键供选手抢答使用&#xff0c;以及NRF24L04无线通信模块将抢答信息发送到接收端&#xff0c;接收…

自己开发完整项目一、登录功能-04(集成jwt)

一、说明 前面文章我们写到了通过数据库查询出用户信息并返回&#xff0c;那么在真实的项目中呢&#xff0c;后端是需要给前端返回一个tocken&#xff0c;当前端通过登录功能认证成功之后&#xff0c;我们后端需要将用户信息和权限整合成一个tocken返回给前端&#xff0c;当前端…