首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MVC将ActionResult保存为字节数组

MVC将ActionResult保存为字节数组
EN

Stack Overflow用户
提问于 2012-11-15 19:39:29
回答 3查看 4.5K关注 0票数 3

我正在寻找一个好的方法来保存一个MVC ActionResult到一个字节数组(文件)。原因是我使用Rotativa将HTML视图转换为PDF。这很好用,并在浏览器中返回PDF给我的用户。现在,我想从服务器发送一封电子邮件,其中包含与附件相同的PDF。为了发送电子邮件,我使用的是ActionMailer.Net nuget包。可以选择将字节数组作为附件包含在内。

因此,我需要将PDF文件中的一个字节数组传递给send mail方法。但是返回PDF的操作的returning类型是ActionResult,而不是FileStreamResult (不幸的是)。我不知道为什么会做出这样的选择,但事实就是如此。

Rotativa包使用Wkhtmltopdf来转换HTML。我想我可以自己实现它,但这似乎没有意义,因为我已经有了一个返回所需内容的方法;我只需要一种方法来将结果放入一个字节数组中。

EN

回答 3

Stack Overflow用户

发布于 2014-08-19 01:15:43

您可以继承'ViewAsPdf‘并创建一个方法来调用’ViewAsPdf‘的一些受保护的方法:

代码语言:javascript
复制
public class ViewAsPdf2 : ViewAsPdf
{
    public ViewAsPdf2(string viewName, object model) : base(viewName, model) { }
    public byte[] GetByte(ControllerContext context)
    {
        base.PrepareResponse(context.HttpContext.Response);
        base.ExecuteResult(context);
        return base.CallTheDriver(context);
    }
}

在你的行动中:

代码语言:javascript
复制
var pdf = new ViewAsPdf2("MyView", model);
var pdfByteArray = pdf.GetByte(ControllerContext);
SendEmail(pdfByteArray);
return null;

所以你可以使用byte[]来做你想做的事情,并且返回的将是PDF。

票数 6
EN

Stack Overflow用户

发布于 2012-11-15 19:49:20

您可以向控制器操作发送一个HTTP请求,该操作应该返回PDF并将结果保存为字节数组。WebClient.DownloadData方法似乎是合适的。

如果您想保留上下文(会话、已验证用户),则需要设置Cookie头:

代码语言:javascript
复制
client.Headers[HttpRequestHeader.Cookie] = Request.Headers["Cookie"];
票数 0
EN

Stack Overflow用户

发布于 2013-03-03 09:39:49

我也有同样的问题,下面是我的解决方案:

基本上,您需要向您自己的URL发出HTTP请求,并将输出保存为二进制文件。简单如,没有重载,帮助器类和臃肿的东西。

您将需要此方法:

代码语言:javascript
复制
    // Returns the results of fetching the requested HTML page.
    public static void SaveHttpResponseAsFile(string RequestUrl, string FilePath)
    {
        try
        {
            HttpWebRequest httpRequest = (HttpWebRequest)WebRequest.Create(RequestUrl);
            httpRequest.UserAgent = "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)";
            httpRequest.Headers.Add(HttpRequestHeader.AcceptEncoding, "gzip,deflate");
            HttpWebResponse response = null;
            try
            {
                response = (HttpWebResponse)httpRequest.GetResponse();
            }
            catch (System.Net.WebException ex)
            {
                if (ex.Status == WebExceptionStatus.ProtocolError)
                    response = (HttpWebResponse)ex.Response;
            }

            using (Stream responseStream = response.GetResponseStream())
            {
                Stream FinalStream = responseStream;
                if (response.ContentEncoding.ToLower().Contains("gzip"))
                    FinalStream = new GZipStream(FinalStream, CompressionMode.Decompress);
                else if (response.ContentEncoding.ToLower().Contains("deflate"))
                    FinalStream = new DeflateStream(FinalStream, CompressionMode.Decompress);

                using (var fileStream = System.IO.File.Create(FilePath))
                {
                    FinalStream.CopyTo(fileStream);
                }

                response.Close();
                FinalStream.Close();
            }
        }
        catch
        { }
    }

然后在你的控制器中,你可以这样调用它:

代码语言:javascript
复制
SaveHttpResponseAsFile("http://localhost:52515/Management/ViewPDFInvoice/" + ID.ToString(), "C:\\temp\\test.pdf");

还有哇啦!该文件在您的文件系统中,您可以双击并打开PDF,或者通过电子邮件将其发送给您的用户,或者任何您需要的东西……

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13396789

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档