Служить файл, войти, когда загрузка закончена - PullRequest
0 голосов
/ 19 ноября 2018

Я пытаюсь сохранить журнал, когда большой файл загружается с моего сервера. Файл подается этим методом:

public IActionResult Download(string filename)
{
    FileStream stream = new FileStream(this.Path + filename,
        FileMode.Open,
        FileAccess.Read,
        FileShare.ReadWrite,
        65536,
        FileOptions.Asynchronous | FileOptions.SequentialScan
    );

    return File(stream, "application/octet-stream", filename);
}

Когда файл закончен, я хочу сохранить запись базы данных этого.

До сих пор мои идеи заключались в том, чтобы найти событие, которое слушает, когда поток удаляется или закрывается, но этого, похоже, не существует. У меня была другая идея - сравнить положение потока с его длиной, но тогда я понятия не имею, как это проверить.

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018

Для выполнения метода после завершения загрузки вы можете попробовать ActionFilter, его OnActionExecuted будет вызван после завершения Download метода.

  • FileDownloadCompleteActionFilter.cs

    public class FileDownloadCompleteActionFilter : ActionFilterAttribute
    {
        private readonly MVCProContext _context;
        public FileDownloadCompleteActionFilter(MVCProContext context)
        {
            _context = context;
        }
        public override void OnActionExecuted(ActionExecutedContext context)
        {
            base.OnActionExecuted(context);
            //called after executing the action
            _context.Language.Add(new Language {  LanguageName = "L1"});
            _context.SaveChanges();
        }
    }
    
  • Используйте метод.

        [TypeFilter(typeof(FileDownloadCompleteActionFilter))]
        public IActionResult About()
        {
            ViewData["Message"] = "Your application description page.";
    
            return View();
        }
    
0 голосов
/ 19 ноября 2018

Что если вы создали собственный класс потока, который позволял вам регистрировать это событие?Примерно так:

public class MyAwesomeStream : FileStream
{
    //...
    public override Dispose(bool disposing)
    {
        //do your event logging / handling here

        base.Dispose(disposing);
    )
}

Затем просто поменяйте его там, где вы использовали FileStream.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...