无法使用ember在浏览器中阅读pdf内容

时间:2017-03-02 16:47:22

标签: javascript ajax pdf ember.js

目标:显示一个pdf文件,使用ember在新窗口中作为服务器响应接收。

路线文件中的代码:

actions: {
    pdfClick(assessmentId) {
      var result = [];
      return new Ember.RSVP.Promise(function (resolve, reject) {
        Ember.$.ajax({
          type: 'GET',
          url: 'http://localhost:4200/abc/secured/rest/questions/166',
          success: function (data) {
            var winlogicalname = "detailPDF";
            var winparams = 'dependent=yes,locationbar=no,scrollbars=yes,menubar=yes,' +
              'resizable,screenX=50,screenY=50,width=850,height=1050';

            var detailWindow = window.open("content-type:application/pdf");
            detailWindow.document.write(data);
          },
          error: function (request, textStatus, error) {
            console.log(error);
          }
        });
      });
    }
  }

混乱:

var detailWindow = window.open("content-type:application/pdf");
detailWindow.document.write(data);

在window.open中,我们将内容类型设置为application / pdf,然后当我们尝试写入数据(作为来自服务器的响应而接收的PDF文件的字节流)时,垃圾数据将出现在新窗口中。

如果我通过Chrome浏览器点击该服务,则Chrome可以显示pdf,但如果我使用ember ajax使用相同的服务,则无法在新窗口中显示pdf。

1 个答案:

答案 0 :(得分:0)

问题在于jQuery。 jQuery不处理二进制数据(Reference)。当您的服务器发送二进制文件时,您无法处理此请求。

您有不同的选择:

  1. 使用base64加密传输二进制数据:实际上我不喜欢它,因为它的开销。
  2. 使用纯XMLHttpRequest而不是jQuery:我在我当前的项目中使用过它,它可以工作!但代码行太多,难以跟踪和维护。需要用Ember.Promise包装。我的实施非常接近这些答案:12
  3. 使用jQuery传输器:我看到了它但还没有使用它。我不知道它是否有效。如果您想查看,可以使用reference