highcharts 自带的图片下载需要网络,有自己的编码格式,如果编码不同意,很容易图片中出现乱码。可以自己写个servlet,所传参数可以自己控制,而且也可以对图片进行简单处理。
我试过ajax的异步图片下载,结果失败了,这里就不展示了,这里使用表单提交。
//能够弹出保存文件对话框
function downloadFileByForm(bingtu) {
var svg = bingtu.getSVG();
var url = "../complaint/highcharsExportServlet";
var fileName = "chart";
var form = $("<form></form>").attr("action", url).attr("method", "post");
form.append($("<input></input>").attr("type", "hidden").attr("name", "fileName").attr("value", fileName));
form.append($("<input></input>").attr("type", "hidden").attr("name", "svg").attr("value", svg));
form.append($("<input></input>").attr("type", "hidden").attr("name", "type").attr("value", "image/png"));
form.appendTo('body').submit().remove();
}
var bingTu1_Options = {
exporting:{
buttons: {
contextButton: {
menuItems: [{
text: '下载 JPEG 图片',
onclick: function() {
downloadFileByForm(this); //js方法
}
},
dafaultMenuItem[7],
dafaultMenuItem[8]
]
}
}
}}
具体的servlet
public class HighcharsExportServlet extends HttpServlet {
private static final Log log = LogFactory.getLog(HighcharsExportServlet.class);protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req, resp);
}protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
request.setCharacterEncoding("GBK");// 设置编码,解决乱码问题,具体的根页面保持一致
String type = request.getParameter("type");
String svg = request.getParameter("svg");
String filename = request.getParameter("fileName");
filename = filename == null ? "chart" : filename;
ServletOutputStream out = response.getOutputStream();
if (null != type && null != svg) {
svg = svg.replaceAll(":rect", "rect");
String ext = "";
Transcoder t = null;
if (type.equals("image/png")) {
ext = "png";
t = new PNGTranscoder();
} else if (type.equals("image/jpeg")) {
ext = "jpg";
t = new JPEGTranscoder();
} else if (type.equals("image/svg+xml"))
ext = "svg";
if (null != t) {
ByteArrayOutputStream stream = new ByteArrayOutputStream();
TranscoderInput input = new TranscoderInput(new StringReader(svg));
TranscoderOutput output = new TranscoderOutput(stream);
try {
t.transcode(input, output);
response.reset();
response.setContentLength(stream.size());
response.setHeader("Content-disposition", new StringBuilder().append("attachment; filename=")
.append(filename).append(".").append(ext).toString());
response.setHeader("Content-type", type);
out.write(stream.toByteArray());
} catch (TranscoderException e) {
out.print("Problem transcoding stream. See the web logs for more details.");
e.printStackTrace();
}
} else if (ext.equals("svg")) {
out.print(svg);
OutputStreamWriter writer = new OutputStreamWriter(out, "GBK");
writer.append(svg);
writer.close();
} else
out.print("Invalid type: " + type);
} else {
response.addHeader("Content-Type", "text/html");
out.println("Usage:\n\tParameter [svg]: The DOM Element to be converted."
+ "\n\tParameter [type]: The destination MIME type for the elment to be transcoded.");
}
out.flush();
out.close();
}
}
web.xml 的配置
<servlet>
<servlet-name>HighcharsExportServlet</servlet-name>
<servlet-class>com.surekam.cti.complaint.servlet.HighcharsExportServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HighcharsExportServlet</servlet-name>
<url-pattern>/complaint/highcharsExportServlet</url-pattern>
</servlet-mapping>