前言
本文介绍从零搭建.NET Core Web API 文件上传项目,文中代码以上传文件为例。
源码下载地址:下载地址
步骤
1 创建新的.NET Core Web API 项目,如下图。
2 给项目命名
3 框架使用的是.NET 8.0(长期支持)
4 项目创建好后得到如下目录结构
5 运行项目出现SwaggerAPI文档页面
6 创建一个新的类库项目,放我们的一些帮助类。
7 创建类库
8 给新建的类库命名
9 选择和之前框架一样的框架版本
10 编写保存缩略图的帮助类代码,代码如下
usingSystem;usingSystem.Collections.Generic;usingImageMagick;namespaceTS.Common.Helpers{publicclassImageHelper{/// <summary>/// 保存缩略图/// </summary>/// <param name="originalFilePath">原图地址</param>/// <param name="destinationFilePath">模板地址</param>/// <param name="targetWidth">目标大小</param>publicstaticboolResizeAndSaveImage(string originalFilePath,string destinationFilePath,int targetWidth){bool flag =false;using(MagickImage image =newMagickImage(originalFilePath)){if(image.Width > targetWidth){int targetHeight =(int)(((double)targetWidth / image.Width)* image.Height);
image.Resize(targetWidth, targetHeight);
image.Write(destinationFilePath);
flag =true;}else{
image.Resize(image.Width, image.Height);
image.Write(destinationFilePath);
flag =true;}}return flag;}}}
11 当然这个代码需要用到Magick,我们使用NuGet安装
12 安装如下图版本包
13 在API项目中添加控制器文件, 命名为FileController.cs
14 编写上传文件的代码
usingMicrosoft.AspNetCore.Http;usingMicrosoft.AspNetCore.Mvc;namespaceFileUploadAPI.Controllers{[Route("api/[controller]")][ApiController]publicclassFileController:ControllerBase{privatereadonlystring fileAddr ="C:/Web/WebSevice/template/";/// <summary>/// 上传文件/// </summary>/// <param name="file"></param>/// <returns></returns>[HttpPost("UploadifyFile")]publicasyncTask<IActionResult>UploadifyFile([FromForm]IFormFile file){// 获取文件后缀名string fileExtension = Path.GetExtension(file.FileName).ToLower();string[] allowedExtensions ={".jpg",".jpeg",".png",".gif",".bmp",".webp"};string fileName = Path.GetFileNameWithoutExtension(file.FileName);string originalFileName = Path.Combine(fileAddr, fileName + fileExtension);// 判断是否是图片文件if(!allowedExtensions.Contains(fileExtension)){if(!System.IO.File.Exists(originalFileName)){awaitSaveFileAsync(file, originalFileName);}}else{// 图片文件 保存缩略图
originalFileName = Path.Combine(fileAddr, fileName +"_o"+ fileExtension);string smallFileName = Path.Combine(fileAddr, fileName +"_s"+ fileExtension);string mediumFileName = Path.Combine(fileAddr, fileName +"_m"+ fileExtension);if(!System.IO.File.Exists(originalFileName)){awaitSaveFileAsync(file, originalFileName);
TS.Common.Helpers.ImageHelper.ResizeAndSaveImage(originalFileName, smallFileName,200);// 调整宽度为200
TS.Common.Helpers.ImageHelper.ResizeAndSaveImage(originalFileName, mediumFileName,500);// 调整宽度为500}}returnOk(fileName);}/// <summary>/// 保存原始文件/// </summary>/// <param name="file"></param>/// <param name="filePath"></param>/// <returns></returns>privateasyncTaskSaveFileAsync(IFormFile file,string filePath){string? directory = Path.GetDirectoryName(filePath);if(!Directory.Exists(directory)){
Directory.CreateDirectory(directory);}using(var stream =newFileStream(filePath, FileMode.Create)){await file.CopyToAsync(stream);}}}}
15 使用调试工具 上传个文件试试
16 上传图片能保存缩略图,上传非图片直接保存
总结
这里只介绍了一个简单文件上传项目代码,一个完整的webapi项目还需要配置其他功能,例如Jwt验证,如何与数据库交互。
版权归原作者 rocweichen 所有, 如有侵权,请联系我们删除。