在前后台分离架构中,前端导出Word常因图片存储于后台而遭遇跨域限制。本文针对jquery.wordexport.js导出图片失败或需VPN编辑的问题,提出将图片转换为Data URL格式的方案。通过设置Image对象的crossOrigin属性并异步获取Base64数据,实现图片内嵌导出,确保生成的Word文档无需额外网络环境即可正常显示图片。
前后端分离导出Word的跨域困境
在前后端分离的项目架构中,前端负责页面展示,而图片资源通常存储在后端服务器。当用户在前台执行导出Word文档的操作时,由于前端与后端域名不同,直接引用后端图片链接会触发浏览器的跨域限制,导致导出功能异常。
使用jquery.wordexport.js等库导出纯文本内容通常没有障碍,但在处理图片时会出现明显问题。常规做法是将图片以外部链接形式嵌入Word文档,这要求接收方必须能够访问该链接地址。
若图片链接指向需要代理(如VPN)才能访问的服务器,生成的Word文档在普通网络环境下将无法打开或显示图片。即使使用代理,用户往往还需要手动启用Word的编辑模式才能触发图片加载,体验极差。
基于Data URL的图片内嵌解决方案
解决这一问题的核心思路是将远程图片地址转换为Data URL格式(即Base64编码的数据流),然后将其直接嵌入到Word文档中。这样图片数据随文档一起保存,不再依赖外部链接,从而彻底规避跨域和网络访问限制。
具体的实现逻辑涉及遍历文档中的图片元素,利用Canvas或XMLHttpRequest获取图片的Base64数据,并替换原始src属性。以下是关键代码实现:
核心转换代码实现
function changeImgToDataurl(){
var charImg = document.all("exportdom").getElementsByTagName("img");
var imgURLs = "";
for (var i = 0; i < charImg.length; i++) {
var imgURL = charImg[i].currentSrc;
getBase64(imgURL,charImg[i]);
}
}
function getBase64(url,charImg){
var Img = new Image();
Img.crossOrigin = "Anonymous";//跨域必须使用,且后台也得设置允许跨域
dataURL='';
Img.src=url;
Img.onload=function(){ //要先确保图片完整获取到,这是个异步事件
var canvas = document.createElement("canvas"), //创建canvas元素
width=Img.width, //确保canvas的尺寸和图片一样
height=Img.height;
canvas.width=width;
canvas.height=height;
canvas.getContext("2d").drawImage(Img,0,0,width,height); //将图片绘制到canvas中
dataURL=canvas.toDataURL('image/jpg'); //转换图片为dataURL
condataurl?condataurl(dataURL,charImg):null; //调用回调函数
};
}
function condataurl(dataURL,charImg){
charImg.src=dataURL;
//console.log(charImg);
}
上述方法有效解决了前端分离架构下导出Word时图片加载失败的问题,通过Data URL内嵌方式确保了文档的完整性和可移植性。希望此方案能为遇到类似技术难题的开发者提供参考,欢迎进一步探讨与测试。