FileContentResult工作,但下载到字节数组不起作用

时间:2017-09-07 18:48:30

标签: c# asp.net-mvc c#-4.0 asp.net-mvc-5

我正在尝试将HTML转换为PDF文件。

我有以下控制器:

    public ActionResult Offer([FromBody] DocumentTemplateInvoiceViewModel vm)
    {
        return this.Pdf(nameof(Offer), vm, "test.pdf");
    }

当我在这里进行POST时,我会收回文件,然后就可以打开了。快乐的日子!

但是,如果我尝试执行以下操作:

    var termsClient = new RestClient(ConfigurationManager.AppSettings["HostingUrl"]);
    var termsRequest = new RestRequest("/Document/Offer", Method.POST);
    termsRequest.AddJsonBody(vm);
    var json = JsonConvert.SerializeObject(vm);
    var termsBytes = termsClient.DownloadData(termsRequest);
    File.WriteAllBytes("LOCALPATH",termsBytes );

文件已损坏,我无法打开PDF。它有一些大小,因此它存储了一些字节。可能只是没有正确存储:D

知道我做错了什么吗?为什么来自我的控制器的FileContentResult工作,但是当我下载数据时它会损坏?

2 个答案:

答案 0 :(得分:0)

您的问题被标记为MVC,因此我将尝试作为MVC应用程序进行回复。

REST对象似乎表示WEB.API,但也许我错了。 :)

如果您正在谈论FileContentResult,那么我建议您输入ContentType。

var contentType = System.Net.Mime.MediaTypeNames.Application.Pdf;

然后像这样加载FileContentResult:

var fcr = new FileContentResult(ms.ToArray(), contentType); //NOTE: Using a File Stream Result will not work.
fcr.FileDownloadName = FileName; 

我看到你正在使用PDF生成,所以这里是我用来为PDF生成FileContentResult的例子:

    public FileContentResult CreatePdfFileContentResult()
    {
        var contentType = System.Net.Mime.MediaTypeNames.Application.Pdf;
        using (MemoryStream ms = new MemoryStream())
        {
            // Create an instance of the document class which represents the PDF document itself.
            Document document = new Document(PageSize.A4, 25, 25, 30, 30);
            // Create an instance to the PDF file by creating an instance of the PDF 
            // Writer class using the document and the filestrem in the constructor.
            PdfWriter writer = PdfWriter.GetInstance(document, ms);

            if (OnPdfMetaInformationAdd != null)
                OnPdfMetaInformationAdd(document, DataSource);

            // Open the document to enable you to write to the document
            document.Open();

            if (OnPdfContentAdd != null)
                OnPdfContentAdd(document, DataSource);
            else throw new NotImplementedException("OnPdfContentAdd event not defined");

            // Close the document
            document.Close();
            // Close the writer instance
            writer.Close();

            var fcr = new FileContentResult(ms.ToArray(), contentType); //NOTE: Using a File Stream Result will not work.
            fcr.FileDownloadName = FileName;                
            return fcr;
        }
    }

答案 1 :(得分:0)

事实证明,我是个白痴,问题是完全不同的。端点只返回404错误,该错误刚刚下载并包装到一个文件中(显然它提供了一个损坏的PDF文件)。

所以这段代码完美无缺。看着Fiddler的请求很快就显示出了这个问题。