服务文件,下载完成后记录

时间:2018-11-19 19:45:19

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

我正在尝试保存从服务器下载大文件的日志。 该文件通过以下方法提供:

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 :(得分:1)

如果您创建了一个允许您记录该事件的自定义流类,该怎么办?像这样:

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

        base.Dispose(disposing);
    )
}

然后只要在使用FileStream的地方交换即可。

答案 1 :(得分:1)

要在下载完成后执行方法,可以尝试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();
        }