流后文件锁定.复制到 .netCore2.



我正在使用JSReport在.netCore2中生成报告;在下面的方法中,视图将返回给用户,并将报告保存在指定的目录中;

            public IActionResult ImageDownload()
                {
                  HttpContext.JsReportFeature().Recipe(Recipe.PhantomPdf)
                      .Configure((r) => r.Template.Phantom = new Phantom
                      {
                          Format = PhantomFormat.A4,
                          Orientation = PhantomOrientation.Portrait                 
                      }).OnAfterRender( (r) =>
                          {
                             var streamIo = r.Content; // streamIo  is of type System.IO
streamIo.CopyTo(System.IO.File.OpenWrite("C:GeneratedReports\myReport.pdf"));
                             streamIo.Seek(0, SeekOrigin.Begin);                 
                          }
                      );
                  var dp = new Classes.DataProvider();
                  var lstnames = dp.GetRegisteredNames();
                  var lst = lstnames.ToArray<string>();
                  return View("Users", lst);
                }

返回视图后,将打开一个新的浏览器,显示 pdf 报告。同样,相同的pdf将保存在给定目录的网络服务器中;问题是目录中创建的报告似乎被锁定了,我无法复制它,打开它......除非我关闭 .net 解决方案。对这里发生的事情有什么解释吗?

FileStream完成后OnAfterRender不会关闭,这意味着没有其他应用程序可以打开/访问它。尝试更改代码以在File.OpenWrite调用周围放置一个 using 块,以包含FileStreamusing 语句,例如

public IActionResult ImageDownload()
{
    HttpContext.JsReportFeature().Recipe(Recipe.PhantomPdf)
        .Configure((r) => r.Template.Phantom = new Phantom
        {
            Format = PhantomFormat.A4,
            Orientation = PhantomOrientation.Portrait                 
        }).OnAfterRender( (r) =>
        {
            var streamIo = r.Content; // streamIo  is of type System.IO
            using(var fs = System.IO.File.OpenWrite("C:GeneratedReports\myReport.pdf"))
            {
                streamIo.CopyTo(fs);
            }
            streamIo.Seek(0, SeekOrigin.Begin);                 
        }
    );
    var dp = new Classes.DataProvider();
    var lstnames = dp.GetRegisteredNames();
    var lst = lstnames.ToArray<string>();
    return View("Users", lst);
}

最新更新