HttpContext.Current.Request.Files
获取文件集合,遍历后使用 SaveAs
方法保存文件。
在C# Web API中接收文件流通常涉及到处理HTTP请求中的文件数据,以下是详细的步骤和示例代码,展示如何接收并保存上传的文件:
1、创建API项目:使用Visual Studio创建一个新的ASP.NET Core Web API项目。
2、安装必要的NuGet包:确保安装了Microsoft.AspNetCore.Mvc
和Microsoft.AspNetCore.Http.Abstractions
等包。
创建一个控制器类来处理文件上传请求,在这个示例中,我们将创建一个名为FileUploadController
的控制器。
using Microsoft.AspNetCore.Mvc; using System.IO; using System.Threading.Tasks; [Route("api/[controller]")] [ApiController] public class FileUploadController : ControllerBase { [HttpPost] public async Task<IActionResult> Upload() { if (!MultipartRequestHelper.IsMultipartContentType(Request.ContentType)) { return StatusCode(400, "Invalid request content type"); } var file = Request.Form.Files[0]; if (file is null || file.Length == 0) { return StatusCode(400, "No file was uploaded."); } var fileName = Path.GetRandomFileName(); var filePath = Path.Combine(Directory.GetCurrentDirectory(), "Uploads", fileName); using (var stream = new FileStream(filePath, FileMode.Create)) { await file.CopyToAsync(stream); } return Ok(new { success = true, message = "File uploaded successfully", fileName = fileName }); } }
2. MultipartRequestHelper类(可选)
为了检查请求的内容类型是否为multipart/form-data,可以创建一个辅助类MultipartRequestHelper
,这个类不是必需的,但可以提高代码的可读性和可维护性。
using System.Text.RegularExpressions; public static class MultipartRequestHelper { private static readonly Regex MultipartContentTypeRegex = new Regex(@"^multipart/", RegexOptions.IgnoreCase | RegexOptions.Compiled); public static bool IsMultipartContentType(string contentType) { return !string.IsNullOrEmpty(contentType) && MultipartContentTypeRegex.IsMatch(contentType); } }
如果你使用的是ASP.NET Core的默认路由配置,那么上述控制器应该已经能够正常工作,如果你需要自定义路由,可以在Startup.cs
或Program.cs
中进行配置。
你可以使用Postman或任何其他HTTP客户端工具来测试这个API,发送一个POST请求到http://localhost:5000/api/FileUpload
,并在请求体中包含一个文件,确保将请求的内容类型设置为multipart/form-data
。
Q1: 如果上传的文件很大,服务器是否会崩溃?
A1: 不会,因为ASP.NET Core自动处理大文件上传,但你需要确保服务器有足够的内存和磁盘空间来存储文件,你可以通过配置Kestrel
服务器选项来调整最大允许的文件大小。
Q2: 如何处理多个文件上传?
A2: 你可以使用IFormFileCollection
来接收多个文件,在控制器方法中,你可以遍历这个集合并分别处理每个文件。
[HttpPost] public async Task<IActionResult> UploadMultiple() { if (!MultipartRequestHelper.IsMultipartContentType(Request.ContentType)) { return StatusCode(400, "Invalid request content type"); } var files = Request.Form.Files; if (files.Count == 0) { return StatusCode(400, "No files were uploaded."); } foreach (var file in files) { var fileName = Path.GetRandomFileName(); var filePath = Path.Combine(Directory.GetCurrentDirectory(), "Uploads", fileName); using (var stream = new FileStream(filePath, FileMode.Create)) { await file.CopyToAsync(stream); } } return Ok(new { success = true, message = "Files uploaded successfully" }); }