首页
学习
活动
专区
圈层
工具
发布

使用ASP.net核心web api发送多个文件

ASP.NET Core Web API 发送多个文件指南

基础概念

在ASP.NET Core Web API中发送多个文件是一种常见的需求,特别是在需要批量上传或处理多个文件的场景中。ASP.NET Core提供了强大的文件上传功能,可以轻松处理单个或多个文件的上传请求。

实现方法

1. 前端准备

首先,你需要一个前端表单来发送多个文件。HTML示例如下:

代码语言:txt
复制
<form method="post" enctype="multipart/form-data" action="/api/upload">
    <input type="file" name="files" multiple />
    <input type="submit" value="Upload" />
</form>

或者使用JavaScript的Fetch API:

代码语言:txt
复制
async function uploadFiles(files) {
    const formData = new FormData();
    for (let i = 0; i < files.length; i++) {
        formData.append('files', files[i]);
    }
    
    const response = await fetch('/api/upload', {
        method: 'POST',
        body: formData
    });
    
    return await response.json();
}

2. 后端API实现

在ASP.NET Core Web API中处理多个文件上传:

代码语言:txt
复制
[ApiController]
[Route("api/[controller]")]
public class UploadController : ControllerBase
{
    [HttpPost]
    public async Task<IActionResult> UploadFiles(List<IFormFile> files)
    {
        if (files == null || files.Count == 0)
        {
            return BadRequest("No files uploaded.");
        }

        long size = files.Sum(f => f.Length);
        var filePaths = new List<string>();

        foreach (var file in files)
        {
            if (file.Length > 0)
            {
                // 为每个文件生成唯一文件名
                var fileName = $"{Guid.NewGuid()}{Path.GetExtension(file.FileName)}";
                var filePath = Path.Combine("Uploads", fileName);

                // 确保目录存在
                Directory.CreateDirectory("Uploads");

                using (var stream = new FileStream(filePath, FileMode.Create))
                {
                    await file.CopyToAsync(stream);
                }

                filePaths.Add(filePath);
            }
        }

        return Ok(new { count = files.Count, size, filePaths });
    }
}

3. 限制文件大小和类型

你可以添加限制来确保上传的文件符合要求:

代码语言:txt
复制
[HttpPost]
[RequestSizeLimit(100_000_000)] // 限制请求大小为100MB
public async Task<IActionResult> UploadFiles(List<IFormFile> files)
{
    var allowedExtensions = new[] { ".jpg", ".jpeg", ".png", ".gif", ".pdf" };
    
    foreach (var file in files)
    {
        var extension = Path.GetExtension(file.FileName).ToLowerInvariant();
        if (string.IsNullOrEmpty(extension) || !allowedExtensions.Contains(extension))
        {
            return BadRequest($"File {file.FileName} has invalid extension.");
        }
        
        if (file.Length > 10_000_000) // 限制单个文件大小为10MB
        {
            return BadRequest($"File {file.FileName} is too large.");
        }
    }
    
    // 处理文件上传...
}

高级用法

1. 流式上传大文件

对于大文件,可以使用流式上传:

代码语言:txt
复制
[HttpPost]
[DisableRequestSizeLimit]
public async Task<IActionResult> UploadLargeFile()
{
    var request = HttpContext.Request;
    
    if (!request.HasFormContentType)
    {
        return BadRequest("Expected multipart/form-data.");
    }

    var form = await request.ReadFormAsync();
    var files = form.Files;

    // 处理文件...
}

2. 分块上传

对于非常大的文件,可以实现分块上传:

代码语言:txt
复制
[HttpPost]
[Route("chunk")]
public async Task<IActionResult> UploadChunk(
    IFormFile chunk,
    string fileName,
    int chunkNumber,
    int totalChunks)
{
    var tempPath = Path.Combine("Temp", fileName);
    Directory.CreateDirectory("Temp");
    
    using (var stream = new FileStream(tempPath, chunkNumber == 0 ? FileMode.Create : FileMode.Append))
    {
        await chunk.CopyToAsync(stream);
    }
    
    if (chunkNumber == totalChunks - 1)
    {
        // 所有分块已上传,合并文件
        var finalPath = Path.Combine("Uploads", fileName);
        System.IO.File.Move(tempPath, finalPath);
        
        return Ok(new { message = "File uploaded successfully." });
    }
    
    return Ok(new { message = "Chunk uploaded successfully." });
}

常见问题及解决方案

1. 文件上传大小限制

问题:上传大文件时遇到"Request body too large"错误。

解决方案

  • 在Startup.cs中配置Kestrel服务器选项:
代码语言:txt
复制
services.Configure<KestrelServerOptions>(options =>
{
    options.Limits.MaxRequestBodySize = 100_000_000; // 100MB
});
  • 或者在控制器方法上使用[RequestSizeLimit]特性

2. 文件名安全问题

问题:恶意用户可能上传带有特殊字符或路径的文件。

解决方案

代码语言:txt
复制
var safeFileName = Path.GetInvalidFileNameChars()
    .Aggregate(file.FileName, (current, c) => current.Replace(c.ToString(), string.Empty));

3. 并发上传问题

问题:多个用户同时上传文件可能导致冲突。

解决方案

  • 使用唯一文件名(如GUID)
  • 实现文件锁定机制
  • 考虑使用分布式文件系统或云存储

最佳实践

  1. 始终验证文件类型和大小
  2. 使用唯一文件名防止覆盖
  3. 考虑使用云存储服务处理大规模文件存储
  4. 实现进度跟踪功能(特别是大文件)
  5. 考虑安全性:扫描病毒、限制文件类型、设置适当权限

应用场景

  1. 用户批量上传图片或文档
  2. 数据导入功能
  3. 多媒体内容管理
  4. 备份和恢复系统
  5. 分布式文件处理系统

通过以上方法,你可以轻松地在ASP.NET Core Web API中实现多文件上传功能,并根据需求进行定制和扩展。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

没有搜到相关的文章

领券