大文件上传,分片 ASP.NET API

 
Double-click
Select to translate
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Hosting;
using System.IO;
using System.Threading.Tasks;
 
namespace LargeFileUploadApi.Controllers
{
    [ApiController]
    [Route("[controller]")]
    public class UploadController : ControllerBase
    {
        private readonly IHostEnvironment _environment;
 
        public UploadController(IHostEnvironment environment)
        {
            _environment = environment;
        }
 
        [HttpPost]
        public async Task<IActionResult> Upload(IFormFile file, int chunkNumber, int totalChunks)
        {
            if (file == null || file.Length == 0)
            {
                return BadRequest("Empty file");
            }
 
            // 初始化上传目录
            var uploadPath = Path.Combine(_environment.ContentRootPath, "uploads");
            if (!Directory.Exists(uploadPath))
            {
                Directory.CreateDirectory(uploadPath);
            }
 
            // 将当前块写入文件
            var chunkPath = Path.Combine(uploadPath, $"{file.FileName}.part{chunkNumber}");
            using (var fileStream = new FileStream(chunkPath, FileMode.Create))
            {
                await file.CopyToAsync(fileStream);
            }
 
            // 如果所有块都已上传,合并它们
            if (chunkNumber == totalChunks)
            {
                var finalFilePath = Path.Combine(uploadPath, file.FileName);
                using (var finalFileStream = new FileStream(finalFilePath, FileMode.Create))
                {
                    for (var i = 1; i <= totalChunks; i++)
                    {
                        var currentChunkPath = Path.Combine(uploadPath, $"{file.FileName}.part{i}");
                        using (var currentChunkStream = new FileStream(currentChunkPath, FileMode.Open))
                        {
                            await currentChunkStream.CopyToAsync(finalFileStream);
                        }
 
                        System.IO.File.Delete(currentChunkPath);
                    }
                }
            }
 
            return Ok();
        }
    }
}

 取消大小限制

复制代码
public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers();
    services.Configure<FormOptions>(options =>
    {
        options.MultipartBodyLengthLimit = long.MaxValue;
        options.MultipartBoundaryLengthLimit = int.MaxValue;
    });
}
复制代码

 

posted @   skywss27  阅读(16)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示