在ASP.NET Core Web API中发送多个文件是一种常见的需求,特别是在需要批量上传或处理多个文件的场景中。ASP.NET Core提供了强大的文件上传功能,可以轻松处理单个或多个文件的上传请求。
首先,你需要一个前端表单来发送多个文件。HTML示例如下:
<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:
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();
}
在ASP.NET Core Web API中处理多个文件上传:
[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 });
}
}
你可以添加限制来确保上传的文件符合要求:
[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.");
}
}
// 处理文件上传...
}
对于大文件,可以使用流式上传:
[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;
// 处理文件...
}
对于非常大的文件,可以实现分块上传:
[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." });
}
问题:上传大文件时遇到"Request body too large"错误。
解决方案:
services.Configure<KestrelServerOptions>(options =>
{
options.Limits.MaxRequestBodySize = 100_000_000; // 100MB
});
[RequestSizeLimit]
特性问题:恶意用户可能上传带有特殊字符或路径的文件。
解决方案:
var safeFileName = Path.GetInvalidFileNameChars()
.Aggregate(file.FileName, (current, c) => current.Replace(c.ToString(), string.Empty));
问题:多个用户同时上传文件可能导致冲突。
解决方案:
通过以上方法,你可以轻松地在ASP.NET Core Web API中实现多文件上传功能,并根据需求进行定制和扩展。
没有搜到相关的文章