.Net Core实现经典文件上传下载功能

.Net Core实现经典文件上传下载功能

1.文件上传

[HttpPost]
public async Task<object> UploadFile(List<IFormFile> files, string FolderId)
{
    var message = "Upload successful";
    var fileNames = new List<string>();
    var FileSizes = new List<long>();
    var success = true;
    foreach (var file in files)
    {

        // 检查文件大小限制(例如:10MB)
        var FileSite = int.Parse(_appConfiguration["FileManagements:FileSite"].ToString());
        long maxFileSize = FileSite * 1024;
        if ((file.Length / 1024) > maxFileSize)
        {
            message = $"The file size exceeds the {FileSite}MB limit.";
            success = false;
            break;
        }

        // 检查文件类型(根据需要)// 允许的文件扩展名
        var allowed = _appConfiguration["FileManagements:allowedExtensions"].ToString();
        var allowedExtensions = allowed.Split(","); 
        var fileExtension = Path.GetExtension(file.FileName).ToLowerInvariant();
        if (!allowedExtensions.Contains(fileExtension))
        {
            message = "Invalid file type.";
            success = false;
            break;
        }
        // 确定文件保存路径
        var FilePath = _appConfiguration["FileManagements:FilePath"].ToString();
        var folderData = await _folderManagementRepository.FirstOrDefaultAsync(x=> x.Id == long.Parse(FolderId));
        if (folderData != null)
            FilePath = Path.Combine(FilePath, folderData.FolderType, folderData.FolderName);
        if (!Directory.Exists(FilePath))
        {
            Directory.CreateDirectory(FilePath);
        }
        var uniqueFileName = Guid.NewGuid().ToString("N") + "_" + file.FileName; // 生成唯一的文件名
        var filePath = Path.Combine(FilePath, uniqueFileName);

        // 保存文件到服务器
        using (var fileStream = new FileStream(filePath, FileMode.Create))
        {
            await file.CopyToAsync(fileStream);
        }
        decimal size = file.Length / 1024;
        // 在数据库中记录文件信息(假设有一个Document实体)
        var document = new CreateOrEditFileManagementDto
        {
        };
        fileNames.Add(document.FileName);
        FileSizes.Add(document.FileSize);
        await Create(document);

    }
    // 返回成功响应
    return new { fileNames, FileSizes, message, success };
}

2.文件下载

[HttpGet]
public async Task<FileResult> DocumentFile(string token, bool IsFile = true)
{
	// 获取配置路径
	var filePath = _appConfiguration["FileManagements:FilePath"].ToString();
	// 拼接文件夹路径
	if (folderManagementData != null)
	{
	    if (folderManagementData.ParentId.Equals("0"))
	    {
	        filePath = Path.Combine(filePath, folderManagementData.FolderName);
	    }
	    else
	    {
	        filePath = Path.Combine(filePath, folderManagementData.FolderType, folderManagementData.FolderName);
	    }
	}
	// 拼接文件路径
	if(IsFile) 
	    filePath = Path.Combine(filePath, fileManagementData.FilePath);
	// 检查路径是文件还是文件夹
	var fileInfo = new FileInfo(filePath);
	if (fileInfo.Attributes.HasFlag(FileAttributes.Directory))
	{
	    return DocumentFolderZip(folderManagementData.FolderName, filePath);
	}
	else
	{
	    // 根据文件扩展名设置正确的Content-Type
	    var contentType = FileContentType(fileManagementData.FileExtension);
	    // 设置下载时显示的文件名
	    var fileDownloadName = fileManagementData.FileName + fileManagementData.FileExtension;
	
	    // 创建文件结果,使用文件流
	    var fileResult = new FileStreamResult(new FileStream(filePath, FileMode.Open, FileAccess.Read), contentType)
	    {
	        FileDownloadName = fileDownloadName
	    };
	
	    return fileResult;
	}
}
/// <summary>
/// 下载文件夹并压缩zip
/// </summary>
/// <param name="folderName">名称</param>
/// <param name="filePath">路径</param>
/// <returns></returns>
protected FileResult DocumentFolderZip(string folderName, string filePath)
{
    // 创建一个临时ZIP文件
    string tempZipPath = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString() + ".zip");
    // 打包文件夹
    using (var zip = ZipFile.Open(tempZipPath, ZipArchiveMode.Create))
    {
        var folderToZip = new DirectoryInfo(filePath);
        foreach (var file in folderToZip.GetFiles("*", SearchOption.AllDirectories))
        {
            zip.CreateEntryFromFile(file.FullName, file.FullName.Substring(filePath.Length + 1), CompressionLevel.Optimal);
        }
    }
    // 设置ZIP文件的内容类型
    var contentType = "application/zip";

    // 创建 FileStreamResult
    var fileResult = new FileStreamResult(new FileStream(tempZipPath, FileMode.Open, FileAccess.Read), contentType)
    {
        FileDownloadName = $"{folderName}.zip"
    };
    // 返回 FileStreamResult
    return fileResult;
}
private string FileContentType(string fileExtension)
{
    string contentType = string.Empty;
    switch (fileExtension.ToLower())
    {
        case ".txt":
            contentType = "text/plain";
            break;
        default:
            contentType = "application/octet-stream"; // 默认为二进制流,如果无法识别文件类型
            break;
    }
    return contentType;
}

3.增加上传文件大小 4294967296表示4GB

public IServiceProvider ConfigureServices(IServiceCollection services)
{
	services.Configure<Microsoft.AspNetCore.Http.Features.FormOptions>(x =>
	{
	    x.ValueLengthLimit = int.MaxValue;
	    x.MultipartBodyLengthLimit = 4294967296;
	    x.MultipartHeadersLengthLimit = int.MaxValue;
	});
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值