首页 > 解决方案 > 上传文件后自动重命名文件

问题描述

我有一个音乐文件夹,如下图所示

音乐文件夹

和下面的代码上传音乐

private IWebHostEnvironment _environment;
public UploadFileModel(IWebHostEnvironment environment)
{
    _environment = environment;
}

[BindProperty]
public IFormFile Upload { get; set; }
public async Task OnPostAsync()
{
    var file = Path.Combine(_environment.ContentRootPath, "wwwroot/music", Upload.FileName);
    using (var fileStream = new FileStream(file, FileMode.Create))
    {
        await Upload.CopyToAsync(fileStream);
    }
}

在cshtml里面

<form method="post" enctype="multipart/form-data">
    <input type="file" asp-for="Upload" accept=".mp3"/>
    <input type="submit" />
</form>

我想要做的是自动将每个新的 mp3 文件重命名为"Track{last_number + 1}.mp3",以防链中缺少文件来代替它。

标签: c#asp.netasp.net-corerazorfile-upload

解决方案


我按照@John 的步骤编写了以下代码。谢谢@约翰。

private IWebHostEnvironment _environment;
public UploadFileModel(IWebHostEnvironment environment)
{
    _environment = environment;
}

[BindProperty]
public IFormFile Upload { get; set; }
public async Task OnPostAsync()
{
    var musicFileName = "Track0.mp3";
    var musicDirectory = Path.Combine(_environment.ContentRootPath, "wwwroot/music");
    var musicDirectoryInfo = new DirectoryInfo(musicDirectory);
    var fileNumbers = musicDirectoryInfo.GetFiles()
        .Where(x => !String.IsNullOrEmpty(x.Name))
        .Select(x => GetFileNumber(x.Name))
        .OrderBy(x => x)
        .ToList();
    if (fileNumbers.Count > 0)
    {
        var fileNumber = fileNumbers.Last() + 1;
        var missingNumber = GetMissingNumber(fileNumbers);
        if (missingNumber.HasValue)
        {
            fileNumber = missingNumber.Value;
        }

        musicFileName = $"Track{fileNumber}.mp3";
    }

    var file = Path.Combine(_environment.ContentRootPath, "wwwroot/music", musicFileName);
    using (var fileStream = new FileStream(file, FileMode.Create))
    {
        await Upload.CopyToAsync(fileStream);
    }
}


private int GetFileNumber(String musicName)
{
    var lastFileNumber = musicName.Replace("Track", "").Replace(".mp3", "");
    var fileNumber = Convert.ToInt32(lastFileNumber);
    return fileNumber;
}

private static int? GetMissingNumber(List<int> numbers)
{
    var missingNumbers = Enumerable.Range(0, numbers.Last()).Except(numbers).ToList();
    if (missingNumbers.Count > 0)
        return missingNumbers.FirstOrDefault();
    return null;
}

推荐阅读