如何在使用IFormFile上传时更改文件名

时间:2017-05-17 22:39:15

标签: c# asp.net-mvc asp.net-core

我有以下代码(我还在开发它),它成功地将文件上传到所需的路径。

   private async Task AddImage(IFormFile image, string filePath)
    {
      List<string> PermittedFileTypes = new List<string> {
        "image/jpeg",
        "image/png",
      };


      if (PermittedFileTypes.Contains(image.ContentType)) {

        // HERE I WILL CHECK NAME AND CHANGE IF IT ALREADY EXSISTS

        using (var stream = new FileStream(Path.Combine(filePath, image.FileName), FileMode.Create))
        {
          await image.CopyToAsync(stream);
        }
      } 
    }

我遇到的问题是,文件试图以相同的名称上传(显然会出现错误),但文件不同。所以我想检查文件是否存在,如果它确实改变了文件的名称,可能会在最后添加一个&#34; _#),然后在新名称下再次上传文件。问题是IFormFile.FileName仅用于get,我无法设置文件名。

在线查看我看到人们建议将文件复制到新名称,但由于文件无法上传,我无法做到。任何帮助表示赞赏!

2 个答案:

答案 0 :(得分:3)

您可以使用Path.Combine(filePath, Guid.NewGuid() )代替Path.Combine(filePath, image.FileName)来保证文件名是唯一的。

答案 1 :(得分:0)

下面的代码片段可能会有所帮助,我只是在创建流时使用了不同的文件名“thefile”。

public async Task<dynamic> AddFile(IFormFile FormFile, string thefile="newfilename.png", string filePath= @".\DocumentStoredHere\")
    {
        try
        {
            if (!Directory.Exists(filePath))
            {
                Directory.CreateDirectory(filePath);
            }
            using (var stream = System.IO.File.Create(thefile))
            {
                await FormFile.CopyToAsync(stream);
            }
            return true;
        }
        catch (System.Exception ex)
        {
            Console.WriteLine(ex.Message);
            return false;
        }
    }