前言
本文介绍从零搭建.NET Core Web API 文件上传项目,文中代码以上传文件为例。
源码下载地址:下载地址
步骤
1 创建新的.NET Core Web API 项目,如下图。
2 给项目命名
3 框架使用的是.NET 8.0(长期支持)
4 项目创建好后得到如下目录结构
5 运行项目出现SwaggerAPI文档页面
6 创建一个新的类库项目,放我们的一些帮助类。
7 创建类库
8 给新建的类库命名
9 选择和之前框架一样的框架版本
10 编写保存缩略图的帮助类代码,代码如下
using System;
using System.Collections.Generic;
using ImageMagick;
namespace TS.Common.Helpers
{
public class ImageHelper
{
/// <summary>
/// 保存缩略图
/// </summary>
/// <param name="originalFilePath">原图地址</param>
/// <param name="destinationFilePath">模板地址</param>
/// <param name="targetWidth">目标大小</param>
public static bool ResizeAndSaveImage(string originalFilePath, string destinationFilePath, int targetWidth)
{
bool flag = false;
using (MagickImage image = new MagickImage(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 编写上传文件的代码
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
namespace FileUploadAPI.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class FileController : ControllerBase
{
private readonly string fileAddr = "C:/Web/WebSevice/template/";
/// <summary>
/// 上传文件
/// </summary>
/// <param name="file"></param>
/// <returns></returns>
[HttpPost("UploadifyFile")]
public async Task<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))
{
await SaveFileAsync(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))
{
await SaveFileAsync(file, originalFileName);
TS.Common.Helpers.ImageHelper.ResizeAndSaveImage(originalFileName, smallFileName, 200); // 调整宽度为200
TS.Common.Helpers.ImageHelper.ResizeAndSaveImage(originalFileName, mediumFileName, 500); // 调整宽度为500
}
}
return Ok(fileName);
}
/// <summary>
/// 保存原始文件
/// </summary>
/// <param name="file"></param>
/// <param name="filePath"></param>
/// <returns></returns>
private async Task SaveFileAsync(IFormFile file, string filePath)
{
string? directory = Path.GetDirectoryName(filePath);
if (!Directory.Exists(directory))
{
Directory.CreateDirectory(directory);
}
using (var stream = new FileStream(filePath, FileMode.Create))
{
await file.CopyToAsync(stream);
}
}
}
}
15 使用调试工具 上传个文件试试
16 上传图片能保存缩略图,上传非图片直接保存
总结
这里只介绍了一个简单文件上传项目代码,一个完整的webapi项目还需要配置其他功能,例如Jwt验证,如何与数据库交互。