【问题标题】:Returning PDF from MVC controller not working on android browsers从 MVC 控制器返回 PDF 不适用于 android 浏览器
【发布时间】:2016-08-24 17:52:57
【问题描述】:

我有一个控制器,它使用 pdfsharp 构建 PDF 文件并将其作为对 GET 请求的文件响应返回,如下所示:

[HttpGet]
public ActionResult downloadImageResultsPDF()
{    
    // Create a new PDF document
    PdfDocument document = new PdfDocument();
    document.Info.Title = "myhealth.pdf";

    // Create an empty page
    PdfPage page = document.AddPage();

    // Get an XGraphics object for drawing
    XGraphics gfx = XGraphics.FromPdfPage(page);

    //XPdfFontOptions options = new XPdfFontOptions(PdfFontEncoding.Unicode, PdfFontEmbedding.Always);

    // Create a font
    XFont font = new XFont("Times New Roman", 20, XFontStyle.BoldItalic);

    // Draw the text
    gfx.DrawString("Hello, World!", font, XBrushes.Black,
      new XRect(0, 0, page.Width, page.Height),
      XStringFormats.Center);

    MemoryStream stream = new MemoryStream();
    document.Save(stream, false);
    byte[] myFile = stream.ToArray();

    Response.ClearHeaders();

    Response.AddHeader("Content-Disposition", "filename='myhealth.pdf'");

    return File(myFile, "application/pdf");
}

我正在使用剃须刀调用此控制器:

<a href="@Url.Action("downloadImageResultsPDF","Home")">Download</a>

在桌面上的 Chrome、Firefox 和 IE11、iOS 上的 Chrome 和 Safari 以及 Android 6.0 上的 Firefox 上似乎一切正常

我无法让它在 Android 上的 Chrome 或 Android 的默认浏览器上运行。下载似乎开始了,但我得到“下载不成功”。该文件在下载文件夹中显示为“无标题”。

我也尝试使用八位字节流作为文件类型,并使用 .PDF 扩展名(而不是 .pdf)。我尝试在文件名中添加/删除引号,但仍然没有。我也尝试在 content-disposition 标头中使用附件和内联。

我还尝试提供静态 pdf 文件。

似乎没有任何效果。有什么想法吗?

【问题讨论】:

  • 是 Response.AddHeader("Content-Disposition", "attachment; filename='myhealth.pdf'");

标签: c# android model-view-controller http-headers pdf-generation


【解决方案1】:

我遇到了同样的问题,在 Android 上使用 Chrome 或基于 Android 版本的默认浏览器进行下载。您需要创建一个HttpPost。 在我的例子中,我有一个可以下载的文件列表。所以我在一个隐藏变量中捕获文件的 id 并将其作为路由值传递给 Action。

查看

input type="hidden" name="docid" id="docid" value=""

input id="btnSubmit" data-id="${DownloadsId}" type="submit" value="Download" onclick="handleCopy(this)"

<script type="text/javascript">
    function handleCopy(e) {
        var $el = $(e);
        var dataId = $el.attr("data-id");
        document.getElementById("docid").value = dataId;
    }
</script>

控制器

[HttpPost]
[Route("List/{id}")]
[ActionName("List")]
public FileResult RequestFile(int? docid)
{
    if (docid == null)
        return new HttpStatusCodeResult(HttpStatusCode.BadRequest);

    Downloads downloads = db.Downloads.Find(docid);

    if (downloads == null)
        return HttpNotFound();

    if (downloads.FileData != null)
    {
        string fileName = downloads.Filename;
        return File(downloads.FileData.Data, System.Net.Mime.MediaTypeNames.Application.Pdf, fileName);
    }
}

【讨论】:

    猜你喜欢
    • 2011-09-29
    • 1970-01-01
    • 2015-04-02
    • 2012-07-18
    • 1970-01-01
    • 1970-01-01
    • 2010-12-03
    • 2023-03-27
    • 1970-01-01
    相关资源
    最近更新 更多