在浏览器中渲染文件

时间:2019-05-06 16:29:35

标签: javascript html web-services

我正在将发布请求发送到休息服务以获取内容。 内容可以是任何类型。 (pdf,doc,pptx,docx,img,png,mp3等)

我有一个非常简单的html和javascript来加载内容。

html

<html>
<head>
<script type="text/javascript" src="test.js"></script>
click
</head>
<body>
<button type="submit" target='_blank' onclick="Test()">Test</button>
</body>
</html>

JavaScript

function Test() {
    console.log("started");
    var xhttp = new XMLHttpRequest();
    xhttp.responseType = "arraybuffer";
    xhttp.onreadystatechange = function() {
         if (this.readyState == 4 && this.status == 200) {
               console.log(this.response);
               var bytes = new Uint8Array(this.response); // pass byte response to this constructor

var blob=new Blob([bytes], { type: "*/*"});// change resultByte to bytes

var link=document.createElement('a');
link.href=window.URL.createObjectURL(blob);
link.click();
         }
    };
    xhttp.open("POST", "http://localhost:8080/testService", true);
    xhttp.setRequestHeader("Content-type", "application/json");
    xhttp.setRequestHeader("Accept", "*/*");
    xhttp.send("{ \"Id\": \"12345678\" }");
}

现在在线

var blob=new Blob([bytes], { type: "*/*"});

我怎么知道它是什么类型的文件...。如果我像*/*一样保留它,它就不能将其流式传输到浏览器。

1 个答案:

答案 0 :(得分:1)

正如您在注释中指出的那样,您需要获取内容类型标题,您已经设置了响应。这是一个简单的响应,显示了如何获取内容类型标头。

xhr = new XMLHttpRequest();

xhr.addEventListener('load', requestHandler);
xhr.open('GET', your_service_url_here);
xhr.send();

function requestHandler()
{
    console.log(this.getResponseHeader('content-type'));
}

有关XMLHttpRequest.getResponseHeader()方法的更多信息,您可以阅读here

出于流传输的原因,您可以使用所谓的数据URI。

<a href="data:application/octet-stream;charset=utf-16le;base64,//5mAG8AbwAgAGIAYQByAAoA">text file</a>

数据URI的caniuse.com entry指出,对数据URI的支持已经广泛传播。要强制自动下载流,您可以在动态生成的数据URI链接上执行click事件。