简体   繁体   English

在FORM POST请求C#中下载文件

[英]Download a file in FORM POST request C#

I am using C# ASP.NET code and trying to download file on the post request of a form. 我正在使用C#ASP.NET代码,并尝试根据表单的邮寄请求下载文件。 here is my sample code. 这是我的示例代码。

    [HttpPost]
    public ActionResult PostMethodName(PostModel inputModel)
    {
        if (ModelState.IsValid)
        {
//other code is removed.
 //Writing this for the test 
            //Download Method call
            DownloadCertificate("This is the test file to download.");

            var statusHtml = RenderViewToString("Status",
            new ErrorMsgModel
            {                    
                IsSuccess = true,
                ErrorDesc = "desc"
            });

            return Json(new { IsSuccess = true, ErrorDescription = 
statusHtml}, JsonRequestBehavior.AllowGet);
        }
        var statusHtml1 = RenderViewToString("Status",
            new ErrorMsgModel
            {
                IsSuccess = false,
                ErrorDesc = "desc"
            });
        statusHtml1 = statusHtml1.Replace("'", "\\'");
        statusHtml1 = statusHtml1.Replace(Environment.NewLine, "");
        return Json(new { IsSuccess = false, ErrorDescription = statusHtml1 
}, JsonRequestBehavior.AllowGet);
    }

Download method which is called from this method. 从该方法调用的下载方法。

public ActionResult DownloadCertificate(string content)
    {
        //Certificate Download
        const string fileType = "application/pkcs10";
        string fileName = "Certificate" + DateTime.Today.ToString(@"yyyy-MM-dd") + ".csr";
        var fileContent = String.IsNullOrEmpty(contrnt) ? "" : contrnt;
        byte[] fileContents = Encoding.UTF8.GetBytes(fileContent);
        var result = new FileContentResult(fileContents, fileType) { FileDownloadName = fileName };
        return result;
    }

file download is not working, post functionality is working as desired. 文件下载不起作用,发布功能按要求工作。

Your DownloadCertificate method returns a value, but you never use the return value in your PostMethodName method. 您的DownloadCertificate方法返回一个值,但是您永远不要在PostMethodName方法中使用该返回值。

Given that you are returning json from that method I would suggest that you return a direct link to the file result in the response. 假设您从该方法返回json,建议您在响应中返回指向文件结果的直接链接。 The consuming client can then initiate the download. 然后,使用方客户端可以启动下载。 Something like: 就像是:

return Json(new { IsSuccess = true, Location = Url.Action("DownloadContent")});

Alternatively you could consider a more restful approach and return a 302 response from the post action: 或者,您可以考虑采用更轻松的方法,并从post操作返回302响应:

if (ModelState.IsValid)
{
    // you code here
    return RedirectToAction("Controller", "DownloadContent", new {content = "myContent"});
}

This may well proceed with the download transparently depending on your client whilst keeping to the Post-Redirect-Get pattern 根据您的客户端,这很可能会透明地进行下载,同时保持Post-Redirect-Get模式

[HttpPost]
public ActionResult DownloadCertificate(PostModel inputModel, string content)
{
    if(!ModelState.IsValid){return Json(new {Success=false,//error descr})}
    //Certificate Download
    const string fileType = "application/pkcs10";
    string fileName = "Certificate" + DateTime.Today.ToString(@"yyyy-MM-dd") + ".csr";
    var fileContent = String.IsNullOrEmpty(contrnt) ? "" : contrnt;
    byte[] fileContents = Encoding.UTF8.GetBytes(fileContent);
    var result = new FileContentResult(fileContents, fileType) { FileDownloadName = fileName };
    return result;
}

In your previous code you don`t use DownloadCertificate result, you simly execute it. 在之前的代码中,您没有使用DownloadCertificate结果,而是执行了它。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM