【问题标题】:Firefox not downloading properly displayed blob PDFFirefox 没有下载正确显示的 blob PDF
【发布时间】:2017-03-29 11:07:49
【问题描述】:

尝试在 Firefox (v. 49.0.2) 浏览器中保存 (CTRL+S) 正确显示的 PDF 文档时,我的客户无法下载 PDF 文档。 我不知道这是我的编程问题还是浏览器问题。 我可以下载的唯一方法是单击 PDF 插件的“下载”按钮,但我的客户希望使用 (CTRL+S) 选项保存文件。 请看这张照片:

还有一个角度代码,我尝试在浏览器中打开文件:它适用于 Chrome 和 Edge,它还可以在 Firefox 中打开 PDF。响应对象是一个 $http 响应。

function openFile(response) {

        var responseHeaders = response.headers();
        var contentType = responseHeaders['content-type'];
        var contentDisposition = responseHeaders['content-disposition'];
        var fileName = contentDisposition.match(/filename="(.+)"/)[1];
        fileName = fileName.substring(0, fileName.indexOf(';')-1);
        var file = new Blob([response.data], { type: contentType });

        if(contentType==='application/pdf') //YES content-type is PDF
        {
            try
            {
                var fileURL = URL.createObjectURL(file);
                window.open(fileURL);
            }
            catch(err) //For Edge, just save a file
            {
                FileSaver.saveAs(file, fileName);
            }
        }
        else //for other content types, just save a file
        {
            FileSaver.saveAs(file, fileName);
        }
    }

这是我的 C# 后端代码:

  byte[] report = service.GetReportCustomerCreditRatesCard();//render report
        RenderFormatResolver renderResolver = new RenderFormatResolver(request.renderFormat);
        HttpContent content = new ByteArrayContent(report);
        var response = new HttpResponseMessage(HttpStatusCode.OK);
        response.Content = content;
        response.Content.Headers.ContentType = new MediaTypeHeaderValue(renderResolver.MIMEType);
        response.Content.Headers.ContentLength = report.Length;
        response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") //"attachment", "inline"
        {
           FileName = String.Format("{0}." + renderResolver.FileNameExtension,                    
Translations.REPORT_FILENAME_CUSTOMER_CARD),
           Name = Translations.REPORT_FILENAME_CUSTOMER_CARD
        };
        return response;

【问题讨论】:

  • 如果你这样做CTRL+S会发生什么?
  • 它打开另存为对话框,在浏览器顶部栏中表示新下载,它看起来像这张图片
  • 可能是因为url不是以.pdf结尾的?在这里this pdf 似乎有效。您的 http 响应对象中的 the Content-type header 是否设置为 pdf 的 mime 类型?
  • 威尔特,我编辑了我的问题。我不知道如何将 pdf 扩展名添加到生成的 blob 文件 url。内容类型为 application/pdf,否则 Firefox 将不会显示在 PDF 查看器中。
  • 这似乎是 Firefox 中的一个错误,因为它也发生在 EDF 网站上(EDF 代表法国电力公司):我无法在第一次使用 Mozilla Firefox 时下载 PDF 发票.使用Save as 功能在下载管理器中显示Failed 状态。在下载管理器中点击失败下载前面的重试按钮后,文件终于正确下载了。所以我猜这是 Firefox 本身的问题。

标签: c# angularjs pdf firefox blob


【解决方案1】:

尝试一次更改响应对象中的内容处置标头以保存文件名:

Content-Disposition: attachment; filename="document.pdf"

比如:

response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue( 'attachment; filename="document.pdf"' );

这可能会有所帮助。不确定,但值得一试...

【讨论】:

  • 此代码在生成的下载文件名中添加了扩展名,但仍然存在相同的错误。
猜你喜欢
  • 2015-06-04
  • 2021-03-02
  • 1970-01-01
  • 2012-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-31
  • 2010-12-09
相关资源
最近更新 更多