Посмотрите мое решение. Я вообще храню картинки по идентификаторам long.
Как перезаписать имя файла во вложенную папку для Nginx?
Код контроллера, думаю легко адаптируете под ваши нужды.
var now = DateTime.Now;
var image = new DbFile
{
Created = now,
CreatedBy = customer.Id,
Path = uploadedFile.FileName
};
var file = await _ctx.Files.Create(image);
var fullPath = _upHelper.GetFullPathForFile(file.Id, image.Path);
var path = new FileInfo(fullPath).DirectoryName;
if (!Directory.Exists(path))
{
Directory.CreateDirectory(path);
}
using (var fileStream = new FileStream(fullPath, FileMode.Create))
{
await uploadedFile.CopyToAsync(fileStream);
var md = new FileInfoModel()
{
Id = file.Id,
Created = file.Created,
CreatedBy = file.CreatedBy,
Name = file.Path,
Url = _upHelper.GetUriPath(file.Id, file.Path)
};
gattachments.Add(md);
}
Код хэлпера
private string GetPathFromId(long id, string fileName)
{
var ext = new FileInfo(fileName).Extension;
var fname = id.ToString().Reverse().ToArray();
if (fname.Length == 1)
return $"{fname[0]}/{id}{ext}";
if (fname.Length > 1)
return $"{fname[0]}/{fname[1]}/{id}{ext}";
throw new ArgumentOutOfRangeException("No file with id: " + id);
}