如何用elemental2将byte[]转为JavaScript Blob实现PDF无窗口下载
使用Elemental2将Byte数组转换为Blob并实现PDF本地下载
核心实现步骤
- 将从Domino-REST获取的
byte[]转换为Elemental2的Uint8Array(处理有符号byte到无符号uint8的转换) - 基于
Uint8Array创建指定MIME类型的Blob对象 - 通过临时URL生成下载链接,触发本地下载后清理资源
完整代码示例
import elemental2.core.Uint8Array; import elemental2.dom.Blob; import elemental2.dom.BlobPropertyBag; import elemental2.dom.HTMLAnchorElement; import elemental2.dom.DomGlobal; // 假设pdfBytes是从Domino-REST服务获取的PDF字节数组 byte[] pdfBytes = ...; // 转换Java byte[]为Uint8Array(处理有符号转无符号) Uint8Array uint8Array = new Uint8Array(pdfBytes.length); for (int i = 0; i < pdfBytes.length; i++) { uint8Array.setAt(i, pdfBytes[i] & 0xFF); } // 创建PDF类型的Blob BlobPropertyBag blobOptions = new BlobPropertyBag(); blobOptions.type = "application/pdf"; Blob pdfBlob = new Blob(new Object[]{uint8Array}, blobOptions); // 生成下载链接并触发下载 HTMLAnchorElement downloadLink = (HTMLAnchorElement) DomGlobal.document.createElement("a"); downloadLink.href = DomGlobal.URL.createObjectURL(pdfBlob); downloadLink.download = "generated.pdf"; // 自定义下载文件名 // 触发下载动作 downloadLink.click(); // 清理临时URL,避免内存泄漏 DomGlobal.URL.revokeObjectURL(downloadLink.href);
关键注意事项
- 字节转换处理:Java的
byte是有符号类型,直接赋值给Uint8Array会导致负数被解析为超出范围的数值,必须通过& 0xFF转换为无符号的0-255区间值,否则会造成PDF文件损坏。 - MIME类型指定:创建Blob时必须设置
type为application/pdf,确保浏览器能正确识别文件格式,避免下载后无法打开。 - 资源清理:使用
createObjectURL生成的临时URL会占用浏览器内存,下载完成后务必调用revokeObjectURL释放资源。
内容的提问来源于stack exchange,提问作者El Hoss
相关产品推荐
相关产品推荐

