如何在 JSON 中接收字节数组
How to receive a byte array inside a JSON
我正在尝试从服务器接收 PDF,该 PDF 将被包裹在 JSON.
如果我只是将 pdf 的字节数组发送到前端,我可以通过将 responseType
设置为 arraybuffer
来正确读取它,然后我可以通过以下方式下载 PDF:
var blob = new Blob([data], { type: application/pdf});
if ($window.navigator && $window.navigator.msSaveOrOpenBlob) {
$window.navigator.msSaveOrOpenBlob(blob);
} else {
var a = document.createElement("a");
document.body.appendChild(a);
var fileURL = URL.createObjectURL(blob);
a.href = fileURL;
a.download = fileName;
a.click();
}
}
然而,当服务器尝试发送 JSON 时,如果我将 responseType
设置为 JSON
,那么我将无法转换 blob。但是,如果我将 responseType
设置为 arrayBuffer
,我将得到一个 arrayBuffer 数组,如何将其转换为 JSON,同时仍然能够提取 PDF:
我收到的 JSON 格式为:
{
result: true,
value: <the pdf byte array>,
errorMessage: null
}
将字节数组值设置为字符串。
解析时 JSON 将字符串转换为字节数组。
参考此 Java Byte Array to String to Byte Array 作为示例。
您应该将字节转换为 base64 字符串,然后 UI 从中读取字节。
如果假定以下变量表示 responseText 的结构:
responseText = {
result: true,
value: <the pdf byte array>,
errorMessage: null
}
responseText.value
是字节数组。如果字节数组已经被键入为 Uint8Array 那么这将起作用。
(注意:存在其他 Typed Arrays,因此请选择最适合您的情况):
var blob = new Blob([response.value], { type: 'application/pdf'});
if (window.navigator && window.navigator.msSaveOrOpenBlob) {
window.navigator.msSaveOrOpenBlob(blob);
} else {
var a = document.createElement("a");
document.body.appendChild(a);
var fileURL = URL.createObjectURL(blob);
a.href = fileURL;
a.download = 'test';//filename
a.click();
}
但是,如果存在如下字节的字符串数组或整数数组:
responseText.value = [145, 229, 216, 110, 3]
并且需要将其转换为类型化的字节数组,然后下面的代码就可以工作了:
var ba = new Uint8Array(responseText.value);
或
var ba = new Uint8Array([145, 229, 216, 110, 3]);
因此,
var blob = new Blob([ba], { type: 'application/pdf'});
这样可以使用字节数组创建 blob,因此在 click
事件触发时下载文件。
我正在尝试从服务器接收 PDF,该 PDF 将被包裹在 JSON.
如果我只是将 pdf 的字节数组发送到前端,我可以通过将 responseType
设置为 arraybuffer
来正确读取它,然后我可以通过以下方式下载 PDF:
var blob = new Blob([data], { type: application/pdf});
if ($window.navigator && $window.navigator.msSaveOrOpenBlob) {
$window.navigator.msSaveOrOpenBlob(blob);
} else {
var a = document.createElement("a");
document.body.appendChild(a);
var fileURL = URL.createObjectURL(blob);
a.href = fileURL;
a.download = fileName;
a.click();
}
}
然而,当服务器尝试发送 JSON 时,如果我将 responseType
设置为 JSON
,那么我将无法转换 blob。但是,如果我将 responseType
设置为 arrayBuffer
,我将得到一个 arrayBuffer 数组,如何将其转换为 JSON,同时仍然能够提取 PDF:
我收到的 JSON 格式为:
{
result: true,
value: <the pdf byte array>,
errorMessage: null
}
将字节数组值设置为字符串。 解析时 JSON 将字符串转换为字节数组。
参考此 Java Byte Array to String to Byte Array 作为示例。
您应该将字节转换为 base64 字符串,然后 UI 从中读取字节。
如果假定以下变量表示 responseText 的结构:
responseText = {
result: true,
value: <the pdf byte array>,
errorMessage: null
}
responseText.value
是字节数组。如果字节数组已经被键入为 Uint8Array 那么这将起作用。
(注意:存在其他 Typed Arrays,因此请选择最适合您的情况):
var blob = new Blob([response.value], { type: 'application/pdf'});
if (window.navigator && window.navigator.msSaveOrOpenBlob) {
window.navigator.msSaveOrOpenBlob(blob);
} else {
var a = document.createElement("a");
document.body.appendChild(a);
var fileURL = URL.createObjectURL(blob);
a.href = fileURL;
a.download = 'test';//filename
a.click();
}
但是,如果存在如下字节的字符串数组或整数数组:
responseText.value = [145, 229, 216, 110, 3]
并且需要将其转换为类型化的字节数组,然后下面的代码就可以工作了:
var ba = new Uint8Array(responseText.value);
或
var ba = new Uint8Array([145, 229, 216, 110, 3]);
因此,
var blob = new Blob([ba], { type: 'application/pdf'});
这样可以使用字节数组创建 blob,因此在 click
事件触发时下载文件。