前言
在Web應用程序開發(fā)過程中,將文件上傳到服務器上是一種常見的需求,在很多場景中都非常有用,比如用戶頭像、圖片等資源上傳到服務器后進行存儲或進一步處理。本文將介紹如何使用.NET Web API 實現(xiàn)文件上傳。
實現(xiàn)過程
1、使用 Visual Studio 2022 創(chuàng)建項目 ASP.NET Core Web API 項目
2、配置服務和中間件
添加必要的服務和中間件來處理文件上傳,如果上傳文件存儲目錄不是默認的 wwwroot 目錄,則可以使用 UseStaticFilesr 中間件服務重載方法。使用app.UseStaticFiles配置靜態(tài)文件中間件以達到創(chuàng)建虛擬路徑。如下面代碼段:
using Microsoft.AspNetCore.Http.Features;
using Microsoft.Extensions.FileProviders;
namespace Fountain.WebAPI.UploadDemo
{
public class Program
{
public static void Main(string[] args)
{
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers();
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
builder.Services.Configure<FormOptions>(options =>
{
options.ValueLengthLimit = int.MaxValue;
options.MemoryBufferThreshold = 1;
// 設置單個文件大小限制為2MB
options.MultipartBodyLengthLimit = 2097152;
});
var app = builder.Build();
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseHttpsRedirection();
app.UseAuthorization();
string uploadPath = (app.Environment.ContentRootPath + "/Upload").Replace("/", "\\");
if (!Directory.Exists(uploadPath))
{
Directory.CreateDirectory(uploadPath);
}
// 使用自定義的靜態(tài)文件目錄
app.UseStaticFiles(new StaticFileOptions
{
FileProvider = new PhysicalFileProvider(
Path.Combine(app.Environment.ContentRootPath, "upload")
),
RequestPath = "/upload"
});
app.MapControllers();
app.Run();
}
}
}
3、創(chuàng)建控制器
在項目的 Controllers 文件夾中,創(chuàng)建文件上傳的控制器類。如下面代碼:
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
namespace Fountain.WebAPI.UploadDemo.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class UploadFileController : ControllerBase
{
public static IWebHostEnvironment webHostEnvironment;
/// <summary>
///
/// </summary>
/// <param name="environment"></param>
public UploadFileController(IWebHostEnvironment environment)
{
webHostEnvironment = environment;
}
/// <summary>
///
/// </summary>
/// <param name="file"></param>
/// <returns></returns>
[HttpPost]
public async Task<IActionResult> Upload(IFormFile file)
{
ResponseContent response = new ResponseContent();
try
{
// 在服務器端,應該驗證上傳文件的類型,防止惡意文件(如可執(zhí)行文件)的上傳。
// 可以通過檢查文件的擴展名或者內容類型(ContentType屬性)來進行驗證
var allowedExtensions = new[] { ".jpg", ".png"};
var fileExtension = Path.GetExtension(file.FileName);
if (!allowedExtensions.Contains(fileExtension))
{
response.Success = false;
response.Message = "不允許的文件類型";
return StatusCode(500, response);
}
if (file == null || file.Length == 0)
{
response.Success = false;
response.Message = "沒有文件上傳";
return StatusCode(500, response);
}
// 文件大小限制,限制為2MB
if (file.Length > 2 * 1024 * 1024)
{
response.Success = false;
response.Message = "文件太大";
return StatusCode(500, response);
}
// 設置上傳文件存放路徑
string webPath =string.Format("{0}{1}{2}{3}",webHostEnvironment.ContentRootPath,Path.DirectorySeparatorChar,"Upload", Path.DirectorySeparatorChar);
if (!Directory.Exists(webPath))
{
Directory.CreateDirectory(webPath);
}
//
using (FileStream filestream = System.IO.File.Create(webPath + file.FileName))
{
file.CopyTo(filestream);
filestream.Flush();
}
}
catch (Exception exception)
{
response.Success = false;
response.Message = "文件上傳失敗";
return StatusCode(500, response);
}
response.Success = false;
response.Message = "上傳成功";
return Ok(response);
}
}
}
namespace Fountain.WebAPI.UploadDemo
{
public class ResponseContent
{
/// <summary>
/// 狀態(tài)
/// </summary>
public bool Success { get; set; }
/// <summary>
/// 消息
/// </summary>
public string Message { get; set; }
/// <summary>
/// 保存響應數(shù)據(jù)
/// </summary>
public object Data { get; set; }
}
}
4、優(yōu)化與改進
文件大小限制
默認情況下,ASP.NET Core 對上傳文件的大小設有一定限制。若需突破這一限制,可在 Program.cs 文件中進行配置。
builder.Services.Configure<FormOptions>(options =>
{
options.ValueLengthLimit = int.MaxValue;
options.MemoryBufferThreshold = 1;
// 設置單個文件大小限制為2MB
options.MultipartBodyLengthLimit = 2097152;
});
可以通過在上傳方法中嵌文件大小驗證邏輯,限制文件大小的上傳。
// 文件大小限制 限制為2MB
if (file.Length > 2 * 1024 * 1024)
{
response.Success = false;
response.Message = "文件太大";
return StatusCode(500, response);
}
文件類型驗證
文件上傳,需確保文件為我們需要的類型(如圖片類型),可以通過在上傳方法中嵌文件類型的驗證邏輯。
// 在服務器端,應該驗證上傳文件的類型,防止惡意文件(如可執(zhí)行文件)的上傳。
// 可以通過檢查文件的擴展名或者內容類型(ContentType屬性)來進行驗證
var allowedExtensions = new[] { ".jpg", ".png" };
var fileExtension = Path.GetExtension(file.FileName);
if (!allowedExtensions.Contains(fileExtension))
{
response.Success = false;
response.Message = "不允許的文件類型";
return StatusCode(500, response);
}
小結
通過上述一系列步驟,我們就可在 Web API 中實現(xiàn)文件的上傳功能。在實際應用場景中,我們還需根據(jù)業(yè)務需求進一步拓展完善該功能。
該文章在 2025/1/22 10:21:10 編輯過