当前位置:首页 > 行业动态 > 正文

cwebapi接收文件流

### cwebapi接收文件流主要涉及获取客户端上传的文件流并保存到指定目录,可通过 HttpContext.Current.Request.Files获取文件集合,遍历后使用 SaveAs方法保存文件。

在C# Web API中接收文件流通常涉及到处理HTTP请求中的文件数据,以下是详细的步骤和示例代码,展示如何接收并保存上传的文件:

一、准备工作

1、创建API项目:使用Visual Studio创建一个新的ASP.NET Core Web API项目。

2、安装必要的NuGet包:确保安装了Microsoft.AspNetCore.MvcMicrosoft.AspNetCore.Http.Abstractions等包。

二、编写代码

控制器类

创建一个控制器类来处理文件上传请求,在这个示例中,我们将创建一个名为FileUploadController的控制器。

cwebapi接收文件流

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.csProgram.cs中进行配置。

cwebapi接收文件流

四、测试API

你可以使用Postman或任何其他HTTP客户端工具来测试这个API,发送一个POST请求到http://localhost:5000/api/FileUpload,并在请求体中包含一个文件,确保将请求的内容类型设置为multipart/form-data

五、FAQs

Q1: 如果上传的文件很大,服务器是否会崩溃?

A1: 不会,因为ASP.NET Core自动处理大文件上传,但你需要确保服务器有足够的内存和磁盘空间来存储文件,你可以通过配置Kestrel服务器选项来调整最大允许的文件大小。

cwebapi接收文件流

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" });
}