2016-05-12 3 views
0

Я работаю с веб-интерфейсом ASP .NET, где функция POST API возвращает массив байтов, подобный этому в коде C#:JavaScript-код для отображения файла PDF в браузере из байтового массива (не закодирован base64)

return Ok(outputStream.ToArray()); 

Где outputStream имеет тип System.IO.MemoryStream и ToArray() возвращает массив байтов.

Эта функция возвращает поток PDF, который я хочу показывать пользователям в своем браузере, или, по крайней мере, позволяет им сохранять его.

Я столкнулся с JavaScript example из Stack Overflow, который показывает, как получить Blob из кодированной строки Base64 и отобразить его, и я смог заставить его работать, когда API возвратил закодированную в Base64 строку; однако я не смог заставить его работать, когда API возвращал массив байтов, как показано выше.

Могу ли я получить некоторые примеры кода, как заставить его работать, когда API возвращает массив байтов?

ответ

0

Мой запрос JQuery Ajax POST выглядит как:

function LoadPDF() { 
     var args = []; 
     var x = $.ajax({ 
      type: "POST", 
      url: "DirectoryQuery.aspx/GetFullPdf", 
      contentType: "application/json; charset=UTF-8", 
      responseType: "text/plain; charset=UTF-8", 
      async: true, 
      dataType: "json",        
      processData: "false", 
      success: OnSuccess, 
      error: OnErrorCall 
     }); 
     function OnSuccess(response) { 
      var byteArray = new Uint8Array(response.d); 

      saveTextAsFile("document.pdf", byteArray); 
     } 
     function OnErrorCall(response) { 
      console.log(response);     
      //location.reload(); 
     } 
    } 

Попробуйте File-Save-as.js, как это:

function saveTextAsFile(fileNameToSaveAs, textToWrite) { 
    /* Saves a text string as a blob file*/ 
    var ie = navigator.userAgent.match(/MSIE\s([\d.]+)/), 
     ie11 = navigator.userAgent.match(/Trident\/7.0/) && navigator.userAgent.match(/rv:11/), 
     ieEDGE = navigator.userAgent.match(/Edge/g), 
     ieVer = (ie ? ie[1] : (ie11 ? 11 : (ieEDGE ? 12 : -1))); 

    if (ie && ieVer < 10) { 
     console.log("No blobs on IE ver<10"); 
     return; 
    } 

    var textFileAsBlob = new Blob([textToWrite], { 
     type: 'text/plain' 
    }); 

    if (ieVer > -1) { 
     window.navigator.msSaveBlob(textFileAsBlob, fileNameToSaveAs); 

    } else { 
     var downloadLink = document.createElement("a"); 
     downloadLink.download = fileNameToSaveAs; 
     downloadLink.href = window.URL.createObjectURL(textFileAsBlob); 
     downloadLink.onclick = function (e) { document.body.removeChild(e.target); }; 
     downloadLink.style.display = "none"; 
     document.body.appendChild(downloadLink); 
     downloadLink.click(); 
    } 
} 
+0

К сожалению, это не похоже на работу. Я также получаю это сообщение об ошибке, когда пытаюсь установить responseType в соответствии с тем, что вы указали в вашем примере: «Предоставленное значение» text/plain; charset = UTF-8 'не является допустимым значением перечисления типа XMLHttpRequestResponseType.' –

+0

Честно говоря, я не знаю, почему text/plain; является недопустимым для вас; возможно, попробуйте удалить «charset = UTF-8» и просто использовать «text/plain», надеясь, что UFT-8 по умолчанию? – user1730026

+0

Изменен мой ответ, чтобы включить реализацию file-save-as.js. Надеюсь, поможет – user1730026

Смежные вопросы