如何在 .Net Core 中提供使用 OpenXML SDK 创建的可下载 docx 文件

问题描述

在我的 .net core 2.2 MVC Web 应用程序中,我目前正在使用 OpenXML SDK Productivity Tool 生成一个 .docx 文件

目前,当用户在我的视图上填写表单并点击提交时,将触发 OpenXML 代码生成word 文档,并通过电子邮件发送给用户。我现在需要的是可供该用户下载的 word 文档文件

我不确定如何重新编写代码以使其正常工作。下面是我的 [HTTPPost] 方法

[HttpPost]

public ActionResult AddReferralForm(ReferralForm referralForm)

{

try

{

//generate word document of the referral form

var GeneratedClassOpenXML = new OpenXMLGeneratedClass();

var wwwRoot = _env.WebrootPath;

string constructedFilename = DateTime.Now.ToString("yyyyMMdd") + "_"+ DateTime.Now.ToString("HHmm") + "_";

string fileName = referralFormsLocation + constructedFilename+".docx";

 
var emailaddresstoSendForm = _context.ReferralFormEmailAddresses.FirstOrDefault();

//Generate Word Document referral form - uses Open XML SDK

GeneratedClassOpenXML.CreatePackage(fileName,referralForm,LoggedInUser,emailaddresstoSendForm.EmailAddress);

//method for user to download the word doc
ExportReferral(fileName);



return RedirectToAction("Index","Home",new { id = LoggedInUser.Id });

}

catch (Exception ex)

{

throw new Exception("Error when saving a referral - " + ex);

}

}

方法用户重定向Home/Index生成的 Word 文档的电子邮件GeneratedClassOpenXML.CreatePackage() 内。

我认为这样的代码可以工作,上面的 HTTPPost 方法调用了它,但这不起作用:

[HttpGet]       
public IActionResult ExportReferral(string filePath)
{
    var x = System.IO.File.ReadAllBytes(filePath);

    return File(System.IO.File.ReadAllBytes(filePath),contentType: "application/vnd.openxmlformats-officedocument.wordprocessingml.document",fileDownloadName: "MySheet.docx");

}

我正在尝试寻找一种方法用户返回主页并返回文件内容。有什么办法可以实现吗?

谢谢

解决方法

使用路径重定向到主页

[HttpPost]
public ActionResult AddReferralForm(ReferralForm referralForm)

{

   //Generate Word Document referral form - uses Open XML SDK
   ...
   redirect home/index with fileName 
   return RedirectToAction("Index","Home",new { id = LoggedInUser.Id,file= fileName });

}

索引.cshtml

<!-- you can have your own style -->
<style>
    /* dialog div must be hidden */
    #basicModal {
        display: none;
    }
</style>


<div id="basicModal">
    Confirm to download ?
</div>


<script>
    $(document).ready(function () {
        const urlParams = new URLSearchParams(window.location.search);
        const downloadUrl = urlParams.get('file');

        //window.location = downloadUrl;
        if (downloadUrl != null) {
            $("#basicModal").dialog({
                modal: true,title: "Are you sure?",buttons: {
                    "YES": function () {
                        window.open(downloadUrl,'_blank');
                    },"NO": function () {
                        $(this).dialog("close");
                    }
                }
            });
        }

    });
</script>