基于.NET6平台开发WebApi—— 添加文件上传下载功能
Posted 昨夜丶雨疏风骤
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于.NET6平台开发WebApi—— 添加文件上传下载功能相关的知识,希望对你有一定的参考价值。
本篇为大家介绍WebApi又一个必不可少的功能,那就是文件上传下载。
还记得我们在初期改造项目的时候删掉的wwwroot文件夹吗,这里放的就是项目中的静态资源文件,接下来我们来手动实现这个功能。
1、我们为项目添加一个静态的工具类,命名为CommonFun,并添加如下代码(以后你所有的静态扩展方法都可以放到这里)
using System.Text; namespace NET6.Infrastructure.Tools /// <summary> /// 工具类 /// </summary> public static class CommonFun #region 文件操作 public static FileInfo[] GetFiles(string directoryPath) if (!IsExistDirectory(directoryPath)) throw new DirectoryNotFoundException(); var root = new DirectoryInfo(directoryPath); return root.GetFiles(); public static bool IsExistDirectory(string directoryPath) return Directory.Exists(directoryPath); public static string ReadFile(string Path) string s; if (!File.Exists(Path)) s = "不存在相应的目录"; else var f2 = new StreamReader(Path, Encoding.Default); s = f2.ReadToEnd(); f2.Close(); f2.Dispose(); return s; public static void FileMove(string OrignFile, string NewFile) File.Move(OrignFile, NewFile); public static void CreateDir(string dir) if (dir.Length == 0) return; if (!Directory.Exists(dir)) Directory.CreateDirectory(dir); #endregion
2、打开Program.cs,添加如下代码
#region 启用静态资源访问 //创建目录 var path = Path.Combine(basePath, "Files/"); CommonFun.CreateDir(path); app.UseStaticFiles(new StaticFileOptions FileProvider = new PhysicalFileProvider(path), RequestPath = "/Files" ); #endregion
至此我们就在项目中创建了Files文件夹,并且启用了静态文件访问功能。
3、接下来我们新建一个控制器,命名为UploadController,并添加如下代码
using Microsoft.AspNetCore.Mvc; using NET6.Infrastructure.Tools; namespace NET6.Api.Controllers /// <summary> /// 文件上传 /// </summary> [Route("upload")] public class UploadController : BaseController readonly IConfiguration _config; readonly IWebHostEnvironment _env; public UploadController(IConfiguration config, IWebHostEnvironment env) _config = config; _env = env; /// <summary> /// 上传文件 /// </summary> /// <param name="path">文件分类的文件夹名称</param> /// <returns></returns> [HttpPost("file")] public async Task<IActionResult> FileUpload(string path = "default") var files = Request.Form.Files; if (files.Count == 0) return Ok(JsonView("请选择文件")); var domain = _config["Domain"]; var dircstr = $"/Files/path/DateTime.Now:yyyyMMdd/"; var result = new List<string>(); foreach (var file in files) var filename = Path.GetFileName(file.FileName); if (filename.IsNull()) continue; var fileext = Path.GetExtension(filename).ToLower(); var folderpath = _env.ContentRootPath; CommonFun.CreateDir(folderpath + dircstr); //重新命名文件 var pre = DateTime.Now.ToString("yyyyMMddHHmmssffff"); var after = CommonFun.GetRandom(1000, 9999).ToString(); var fileloadname = dircstr + pre + "_" + after + ProExt(fileext); using (var stream = new FileStream(folderpath + fileloadname, FileMode.Create)) await file.CopyToAsync(stream); result.Add(domain + fileloadname); return Ok(JsonView(result)); #region 校验文件类型 string[] badext = "exe", "msi", "bat", "com", "sys", "aspx", "asax", "ashx" ; private string ProExt(string ext) if (ext.IsNull()) return ""; if (badext.Contains(ext)) throw new Exception("危险文件"); if (ext.First() == \'.\') return ext; return "." + ext; #endregion
至此,我们的文件上传功能便已经开发完成。
聪明的你会发现对于某些特殊文件会出现无法下载的情况,原因是特殊文件需要手动启用MIME支持。
4、我们打开Program.cs,改造一下代码,将我们需要的MIME类型添加到项目中
再次尝试发现文件已经可以正常下载。
本文来自博客园,作者:昨夜丶雨疏风骤,转载请注明原文链接:https://www.cnblogs.com/netsix/p/15777534.html
以上是关于基于.NET6平台开发WebApi—— 添加文件上传下载功能的主要内容,如果未能解决你的问题,请参考以下文章
.NET6+ModbusModbus TCP协议解析仿真环境以及基于.NET实现基础通信
.NET6gRPC服务端和客户端开发案例,以及minimal API服务gRPC服务和传统webapi服务的访问效率大对决